Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Keine Rückmeldung (https://www.delphipraxis.net/144661-keine-rueckmeldung.html)

Samufi 13. Dez 2009 18:43


Keine Rückmeldung
 
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='1' then 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 :wink: ...
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]

Phoenix 13. Dez 2009 18:56

Re: Keine Rückmeldung
 
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?

Samufi 13. Dez 2009 19:09

Re: Keine Rückmeldung
 
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...

Klaus01 13. Dez 2009 19:12

Re: Keine Rückmeldung
 
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

Samufi 13. Dez 2009 19:18

Re: Keine Rückmeldung
 
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...)

Phoenix 13. Dez 2009 19:34

Re: Keine Rückmeldung
 
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.

thkerkmann 13. Dez 2009 19:57

Re: Keine Rückmeldung
 
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

Samufi 13. Dez 2009 20:21

Re: Keine Rückmeldung
 
Vielen Dank für die Antworten, ich muss jetzt erstmal aufhören. Bei weiteren Fragen mach das Thema einfach wieder auf...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz