Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi [Behoben, siehe Beitrag #13] Close; im TTimer lässt Programm manchmal abschmieren (https://www.delphipraxis.net/190970-%5Bbehoben-siehe-beitrag-13%5D-close%3B-im-ttimer-laesst-programm-manchmal-abschmieren.html)

a.def 24. Nov 2016 13:29


[Behoben, siehe Beitrag #13] Close; im TTimer lässt Programm manchmal abschmieren
 
Nach fast getaner Arbeit startet mein Programm einen TTimer.
Der TTimer prüft, ob die Hauptarbeit denn nun wirklich vorbei ist oder nicht anhand dreier Boolean-Variablen die an verschiedenen Stellen gesetzt werden / resettet werden.

Trifft alles zu, steht im Timer Close;

In manchen Fällen schmiert hier das Programm ab. Ich schreibe zum Test vor dem Close im Close-Event selber an oberster Stelle eine Log-Datei. Etwa so
Delphi-Quellcode:
// Programm wird gestartet
// Wenn Programm gestartet, dann wird eine Prozedur aufgerufen, welche einen Timer (Timer_Arbeit) startet
// Dieser Timer setzt Timer_Arbeit.Enabled:=False und klickt Button1

// Wenn Button1-Arbeit fertig, wird Timer1 gestartet
// Sobald ArbeitImGange=True, darf Timer1 Close; aufrufen.

// Der Fehler kommt oft zwischen dem Ende von Timer_Arbeit und Timer1

procedure TForm1.Button1Click(Sender: TObject);
begin
 ArbeitImGange := True;
 // mache deine Arbeit!

 // wenn fertig dann...
 Timer1.Enabled := True;

 ArbeitImGange := False;
end;

// timer
procedure Timer1Timer(Sender: TObject);
begin
 if not ArbeitImGange dann
  begin
   Timer1.Enabled := False;
   schreibeLog('1. Schließen gestartet');
   Close;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 schreibeLog('2. Schließen geht weiter ...');
 // mach weiter
end;
Wenn das Programm abschmiert, steht Lognachricht #1 im Log, #2 aber nicht.
Wenn ich in der Windows-Meldung (APPCRASH) "Das Programm funktioniert nicht mehr" auf OK klicke, wird auch #2 ins Log geschrieben.

D.h da schmiert zwar irgendetwas ab, sobald ich die Windows-Meldung aber bestätige geht es weiter.

Darf man Close; nicht in einem Timer verwenden?

stahli 24. Nov 2016 13:38

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Grundsätzlich sollte das kein Problem machen.

Tust Du im Timer-Event evtl. noch mehr, was Du hier bisher verschwiegen hast? :stupid:
Oder gibt der Debugger vielleicht irgend welche näheren Hinweise auf die Problemursache?

taveuni 24. Nov 2016 13:39

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Zitat:

Zitat von a.def (Beitrag 1354612)
Wenn ich in der Windows-Meldung (APPCRASH) "Das Programm funktioniert nicht mehr" auf OK klicke, wird auch #2 ins Log geschrieben.

Und was steht dann in der Windows Ereignisanzeige?

a.def 24. Nov 2016 13:41

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Ich stoppe den Timer, gebe drei Bool'sche Variablen einen Wert, schreibe den Test-Log und rufe Close; auf.

Und dann schmiert es ab und zu ab.
In diesem Fall kann ich den Debugger leider nicht verwenden, da das Programm über ein CMD-Fenster mit Parametern aufgerufen wird.

Zitat:

Und was steht dann in der Windows Ereignisanzeige?
Suche ich gleich mal raus wenn der Fehler erneut auftritt.

In der Problemsignatur steht nur Unsinn und
Zitat:

Ausnahmecode: c0000005
Jetzt kam der Fehler zum Glück direkt beim ersten Mal.
Timer1 wird aus einer Prozedur eingeschaltet, welche ebenfalls vorher über einen Timer aufgerufen wurde.
Ab und zu kommt der Fehler auch am Ende des Haupttimers und Timer1.

DeddyH 24. Nov 2016 13:57

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Zitat:

Zitat von a.def (Beitrag 1354616)
In diesem Fall kann ich den Debugger leider nicht verwenden, da das Programm über ein CMD-Fenster mit Parametern aufgerufen wird.

Dann gib doch diese Parameter in Delphi über "Start - Parameter" im Feld "Parameter" ein, dann geht auch das Debuggen (oder gibt es das in der Starter nicht?).

a.def 24. Nov 2016 14:07

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Zitat:

Zitat von DeddyH (Beitrag 1354617)
(oder gibt es das in der Starter nicht?).

Ups da habe ich mich verklickt. Ich habe damals die Professional gekauft als sie runtergesetzt war (auch wenn ich kein Professional bin :stupid: )

Funktioniert einwandfrei. Nur was mache ich dann danach, wenn eine Exception geworden wurde?
Weil Chinesisch lesen ist schwierig.

Aviator 24. Nov 2016 14:07

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Zitat:

Zitat von DeddyH (Beitrag 1354617)
Zitat:

Zitat von a.def (Beitrag 1354616)
In diesem Fall kann ich den Debugger leider nicht verwenden, da das Programm über ein CMD-Fenster mit Parametern aufgerufen wird.

Dann gib doch diese Parameter in Delphi über "Start - Parameter" im Feld "Parameter" ein, dann geht auch das Debuggen (oder gibt es das in der Starter nicht?).

Die Lösung wollte ich auch gerade vorschlagen. Alternativ kann er ja einfach so machen als ob die Parameter übergeben wurden.

EmWieMichael 24. Nov 2016 14:13

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Probier doch mal, hinter schreibeLog(1,...) ein Application.ProcessMessages einzufügen.

a.def 24. Nov 2016 14:14

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Werde ich sofort machen und dann gucken was passiert.
Das kann leider von Mal zu Mal etwas dauern bis ich ein Ergebnis habe, da der Fehler recht selten auftaucht.

Ein Application.ProcessMessages; im Timer bringt leider keine Änderung.

Im Debugger steht aktuell immer
Zitat:

00449E2B 3B7308 cmp esi,[ebx+$08]
Manchmal steht der grüne Pfeil auch an "Leave".

Ich habe das Application.ProcessMessages; jetzt mal in den Timer direkt nach begin gesetzt. Mal sehen, ob es etwas ändert.
Ok tut es nicht.

himitsu 24. Nov 2016 14:54

AW: Close; im TTimer lässt Programm manchmal abschmieren
 
Im Debugger starten und schauen wo man landet, wenn die exception geworfen wird.
* siehe Cursorposition/Markierung im Quellcode
* siehe Stacktrace

Und vielleicht vorher einen Haltepunkt auf Close und dann mit F7/F8 weitergucken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Seite 1 von 2  1 2      

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