AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TTimer und Abarbeitung der Messages
Thema durchsuchen
Ansicht
Themen-Optionen

TTimer und Abarbeitung der Messages

Ein Thema von Blamaster · begonnen am 13. Okt 2014 · letzter Beitrag vom 14. Okt 2014
 
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

TTimer und Abarbeitung der Messages

  Alt 13. Okt 2014, 19:29
Hi,

ich habe mal eine kleine Frage zu der TTimer Umsetzung. Ich habe auf dem Hauptformular die TTimer Komponente gesetzt. Somit wird sich um die Freigabe automatisch gekümmert.

Jetzt kam es beim beenden des Programm zu einer Exception.


Delphi-Quellcode:
var
  myObject1: TMyObject;
  myObject2: TMyObject;
  myObject3: TMyObject;

procedure FormX.FormCreate(Sender: TObject);
begin
  myObject1:= TMyObject.Create;
  myObject2:= TMyObject.Create;
  myObject3:= TMyObject.Create;
end;


procedure FormX.Timer(Sender: TObject);
begin
  Button.Caption = myObject1.Status;
end;

procedure FormX.FormDestroy(Sender: TObject);
begin
 myObject1.Free;
 // <-- Exception
 myObject2.Free;
 myObject3.Free;
end;
Der Debugger hat nun gezeigt das innerhalb des FormDestroy nach der Freigabe von myObject1 noch ein TimerEvent ausgelöst und abgearbeitet wird wenn myObject1 bereits freigegeben ist.

Das macht ja soweit bis zu einem gewissen Punkt auch Sinn. Allerdings bin ich bisher davon ausgegangen das die Messages im Programm lediglich im IdleState abgarbeitet werden. Das obige Verhalten widerspricht meiner Annahme. Wann werden die Messages nun wirklich abgarbeitet ?

Ein weiteres Problem. Theoretisch könnte man die Exception ja umgehen indem man im TimerEvent prüft ob myObject1 noch existiert. Alternativ dazu könnte man im FormDestroy bevor die Objekte freigegeben werden Timer.Enable := False setzen.

Allerdings befürchte ich das letzteres auch nicht wirklich zielführend ist. Wenn in einem unglücklichen Fall gerade eine Timer-Message in die Queue gelegt wurde und ich anschließend Timer.Enable := False setze könnte es dennoch passieren das ein Event nach dem Timer.Enable := false ausgeführt wird. Der von TTimer intern verwendete KillTimer() Befehl sorgt ja nicht dafür das bereits in der Queue stehende Messages entfernt werden.

Somit ist durch ein Timer.Enable := false nicht sichergestellt das nach dem Befehl keine Timer Events mehr ausgelöst werden.

Gibt es da eine saubere Möglichkeit um das Problem zu umgehen ?
  Mit Zitat antworten Zitat
 


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 07:10 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