Einzelnen Beitrag anzeigen

a.def
(Gast)

n/a Beiträge
 
#1

[Behoben, siehe Beitrag #13] Close; im TTimer lässt Programm manchmal abschmieren

  Alt 24. Nov 2016, 14:29
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?

Geändert von a.def (24. Nov 2016 um 18:40 Uhr)
  Mit Zitat antworten Zitat