AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Keine Rückmeldung

Ein Thema von Samufi · begonnen am 13. Dez 2009 · letzter Beitrag vom 13. Dez 2009
Antwort Antwort
Samufi

Registriert seit: 27. Nov 2008
Ort: Güstrow
93 Beiträge
 
Turbo Delphi für Win32
 
#1

Keine Rückmeldung

  Alt 13. Dez 2009, 18:43
Hallo,
das Programm, das ich geschrieben habe stürzt an einer bestimmten Stelle manchmal ab (ca. drei mal bei vier Versuchen) - es erscheint im Taskmanager "keine Rückmeldung", ich bekomme aber keine Fehlermeldung von Delphi.
Das Programm lädt kurz vor (oder bei) Auftreten des Problems eine Datei von einem FTP-Server (die zur Laufzeit von einem anderen hochgeladen wird), die kommt aber ohne Probleme auf dem Rechner an (sonst hätte ich eine Fehlermeldung erhalten) - in den Problemfällen war diese aber leer. Dass sie leer war kann an dem vielleicht zeitgleich erfolgten Upload liegen; da die Download-Procdure aber mittels eines Timers immer wiederholt wird und ich für den Fall, dass die Datei leer ist ein "exit" eingebaut habe, sollte das kein Problem darstellen. Hier die entsprechende Procedure:
Delphi-Quellcode:
procedure TForm7.TimerRefreshTimer(Sender: TObject);
var ListeSpiel:TListBox;J,Start:Integer;SpielerLabel:TLabel;SpielName2:String;
begin
ListeSpiel:=TListBox.Create(Form1);
ListeSpiel.Parent:=Form1;
ListeSpiel.visible:=false;
SpielName2:=SpielName.Text;
if ftp.getfile('wizard/'+SpielName2, SpielName2+'.wz')=false then
  begin
    SpielAbgebrochen;
    exit;
  end;
if fileexists(SpielName2+'.wz') then ListeSpiel.Items.LoadFromFile(SpielName2+'.wz') else ftp.Fehlermeldung;
if ListeSpiel.Count=0 then exit; //Hier versuche ich den Fall einer leeren Datei zu umgehen...

if ListeSpiel.Count-1<StrtoInt(ListCount.text) then Start:=0 else Start:=StrtoInt(ListCount.text);
for J := Start to ListeSpiel.Count - 1 do
  begin
      if (form1.Wort(1,ListeSpiel.Items[J])='setzen') then
        begin
          SpielerLabel:=TLabel(Form7.FindComponent('DLabel'+form1.Wort(2,ListeSpiel.Items[J])));
          SpielerLabel.Caption:=SpielerLabel.Caption+' ('+form1.Wort(3,ListeSpiel.Items[J])+')';
        end;
      if (form1.Wort(1,ListeSpiel.Items[J])='setzenReihnfolge') then
        begin
          if (form1.Wort(2,ListeSpiel.Items[J])=Reihnfolge.Text) then setzen else StatusBar1.Panels[0].Text:=SpielerNamen.Items[StrtoInt(form1.Wort(2,ListeSpiel.Items[J]))-1]+' setzt.';
        end;
    if (form1.Wort(1,ListeSpiel.Items[J])='Zug') then
      begin
          if (form1.Wort(2,ListeSpiel.Items[J])=Reihnfolge.Text) then Zug else StatusBar1.Panels[0].Text:=SpielerNamen.Items[StrtoInt(form1.Wort(2,ListeSpiel.Items[J]))-1]+' ist am Zug.';
      end;
    if (form1.Wort(1,ListeSpiel.Items[J])='ausspielen') then
      begin
        if not (form1.Wort(2,ListeSpiel.Items[J])=Reihnfolge.text) then gelegt(form1.Wort(3,ListeSpiel.Items[J]),form1.Wort(2,ListeSpiel.Items[J]));
      end;
    if (form1.Wort(1,ListeSpiel.Items[J])='StichEnde') then
      begin
        SpielerStiche.Items[StrtoInt(StichSieger.text)-1] := Inttostr(StrtoInt(SpielerStiche.Items[StrtoInt(StichSieger.text)-1])+1);
        Stich.Clear;
        if Reihnfolge.text='1then Zug;
      end;
    end;
ListCount.Text:=InttoStr(ListeSpiel.count-1);
ListeSpiel.Free;
end;
Die geladene Datei sollte zwei Zeilen beinhalten, in der einen die Wörter "setzen", "Spieler1" und "5", in der zweiten "Zug" und "1". Ich bin mir durchaus bewusst, dass man aus dem bisschen Quelltext, das ich jetzt gepostet habe nicht so wirklich schlau wird und auch dass der Stil zu wünschen übrig lässt. Bei Bedarf schreibe ich gerne mehr, wahrscheinlich bräuchte man zum umfassenden Verstehen fast alles und das will ich euch nun doch nicht antun ...
Meine Frage ist eher, wo der Fehler liegen könnte, wo ich suchen muss - ich habe es schon längere Zeit versucht, bin aber ratlos. Wisst ihr, was so einen Programmabsturz - noch dazu in so einer Unregelmäßigkeit verursachen kann? (Die Unregelmäßigkeit könnte von der Datei ausgehen, aber warum führt eine leere Datei zum Programmabsturz? (Ich dachte, ich hätte das mit "if ListeSpiel.Count=0 then exit;" umgangen...))
Ich habe mich wahrscheinlich nicht sehr verständlich ausgedrückt, ich versuche gerne, Nachfragen zu beantworten. Letztendlich geht es mir aber vor allem um Ideen, wo ich suchen könnte...
Vielen Dank schon mal fürs Durchwurschteln!
Treuergebenst,
Samufi

[edit=alzaimar] Leerzeichen in der sehr langen Codezeile eingefügt Mfg, alzaimar[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#2

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 18:56
Wenn eine Anwendung nicht mehr reagiert heisst das im Prinzip, sie steckt in einer Endlosschleife (oder in einer endlichen, die aber extrem lange dauert) fest und reagiert derweil nicht mehr auf Windows-Messages. Eine andere Möglichkeit könnte sein, dass die Anwendung auf das zurückkehren einer extern aufgerufenen Method in einem Thread wartet und darin feststeckt.

Wenn Du sagst 'das müsste eigentlich mit .. abgehandelt sein'... hast Du da mal durchdebuggt? Hast Du gesehen das der Fall richtig behandelt wird? Was sagt eigentlich überhaupt der Debugger? An welcher Stelle im Code passiert denn dieses nicht mehr reagieren, also die Stelle an der die Anwendung entweder permanent schleift oder nicht mehr reagiert?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Samufi

Registriert seit: 27. Nov 2008
Ort: Güstrow
93 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 19:09
Vielen Dank für die Antwort erstmal! Also: ich kenne mich nicht so gut aus mit dem debugger - von sich aus hält er auf jeden Fall nicht an. Wenn ich auf das Pausenzeichen drücke lande ich in so ner komischen CPU-Ansicht, die mir nichts sagt. Wenn du mir vielleicht schreiben könntest, wie ich das richtig mache, könnte ich das mal durchexerzieren.
Ich habe die Zeile "if ListeSpiel.Count=0 then exit;" in anderem Kontext ausprobiert, da funktioniert es, die Procedure wird unterbrochen.
Das mit der extern aufgerufenen Method habe ich noch nicht ganz verstanden...
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 19:12
Delphi-Quellcode:
//if ftp.getfile('wizard/'+SpielName2, SpielName2+'.wz')=false then
// besser :
if not ftp.getfile('wizard/'+SpielName2, SpielName2+'.wz') then
  begin
    SpielAbgebrochen;
    exit;
  end;
if fileexists(SpielName2+'.wz') then ListeSpiel.Items.LoadFromFile(SpielName2+'.wz') else ftp.Fehlermeldung;
if ListeSpiel.Count=0 then exit; //Hier versuche ich den Fall einer leeren Datei zu umgehen...
SpielName2.wz wird immer ohne Pfadangabe abgefragt, bist Du dir sicher
das Windows sich immer im richtigen Verzeichnis befindet?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Samufi

Registriert seit: 27. Nov 2008
Ort: Güstrow
93 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 19:18
Ja, ich bin mir schon sicher, das klappt vorher auch ohne Probleme (die Zeile habe ich praktisch aus einer anderen Procedure kopiert). Außerdem wird die Datei ja auf jeden Fall in dasselbe verzeichnis geladen. Falls das das Probläm wäre würde ich aber auch die SpielAbgebrochen-Fehlermeldung kriegen, bzw. die ftp.Fehlermeldung. Daran liegt es also mit sicherheit nicht... Die Sache mit dem If not ist doch nur eine Stilfrage oder? (aber ich merks mir in jedem Fall gerne...)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#6

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 19:34
Zum debuggen:

Du kannst mit einem Klick links neben den Quellcode einen roten Boppel auf Quellcodezeilen setzen. Das ist dann ein sogenannter Breakpoint - und wenn der Code da durchkommt hält er auch an.
Ich empfehle das auf die erste Zeile Deiner Procedure zu setzen.

Dann kannst Du mit einzelschritt jede Zeile durcharbeiten und dabei auch angucken welche Variable gerade welchen Wetr hat (einfach mit der Maus drüberfahren). Debuggen ist so ziemlich das wichtigste Handwerkszeug eines Entwicklers.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 19:57
Hi,

nochwas:
Du erstellst ListeSpiel als TListbox innerhalb der TimerRoutine, aber im Fehlerfall steigst Du mit exit aus der Routine aus und löscht die Instanz nicht wieder.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Samufi

Registriert seit: 27. Nov 2008
Ort: Güstrow
93 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Keine Rückmeldung

  Alt 13. Dez 2009, 20:21
Vielen Dank für die Antworten, ich muss jetzt erstmal aufhören. Bei weiteren Fragen mach das Thema einfach wieder auf...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz