Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TTimer und Abarbeitung der Messages (https://www.delphipraxis.net/182252-ttimer-und-abarbeitung-der-messages.html)

Der schöne Günther 14. Okt 2014 12:19

AW: TTimer und Abarbeitung der Messages
 
Ich kann nichts konstruktives beitragen, nur anmerken, dass mir das auch schon öfter passiert ist: Abarbeiten irgendwelcher Timer-Messages während des Herunterfahrens, wenn schon formularmäßig so gut wie alles zerstört ist...

himitsu 14. Okt 2014 12:34

AW: TTimer und Abarbeitung der Messages
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1275843)
Ich kann nichts konstruktives beitragen, nur anmerken, dass mir das auch schon öfter passiert ist: Abarbeiten irgendwelcher Timer-Messages während des Herunterfahrens, wenn schon formularmäßig so gut wie alles zerstört ist...

Nach dem Freigeben der Form (genauer nach dem Freigeben des TTimer und dessen interne MessageOnlyForm) sollte eigentlich nichts mehr eintreffen.

Das Window, an welches das WM_TIMER geschickt wird, ist dann weg.
Wenn Fenster freigegeben werden, werden deren Messages aus der Queue entfernt, aber selbst wenn nicht, dann existiert das Fenster nicht mehr, welches diese Message empfangen und verarbeiten kann.



Die Queue wird in TApplication.ProcessMessage verarbeitet, welches durch Application.Run, Application.HandleMessage und Application.ProcessMessages behandelt wird.

In der VCL also immer wenn Application.ProcessMessages aufgerufen wird, bzw. zwischen den anderen VCL-Ereignissen (Messages wie Button-Klicks, Timer-Events usw.), welche über/in/durch ProcessMessage ausgeführt werden.

p80286 14. Okt 2014 12:42

AW: TTimer und Abarbeitung der Messages
 
Zitat:

Zitat von Blamaster (Beitrag 1275761)
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.

Wie wäre es mit einem ProcessMessages?
danach sollte die Queue eigentlich leer sein.

Gruß
K-H

himitsu 14. Okt 2014 12:53

AW: TTimer und Abarbeitung der Messages
 
Ein ProcessMessages unbedacht an einer ungünstigen Stelle bereitet mehr Probleme, als es löst.

In diesem Fall würde ich eher ein
Delphi-Quellcode:
while PeekMessage(Msg, FWindowHandle, WM_TIMER, WM_TIMER, PM_REMOVE) do ;
nach dem KillTimer einfügen, welches die Message(s) entfernt.


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

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