Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TTimer nicht Thread-safe (https://www.delphipraxis.net/195146-ttimer-nicht-thread-safe.html)

himitsu 6. Feb 2018 12:50

AW: TTimer nicht Thread-safe
 
Mit TTimer geht es nunmal nicht im Thread, aber natürlich kann man MSDN-Library durchsuchenSetTimer auch innerhalb eines Threads benutzen.
* man muß nur ein Message-Windows im Thread erstellen und da drin einen Timer aktivieren
* und man muß im Thread natürlich auch auch die Window-Messages verarbeiten, vor allem WM_TIMER

hzzm 6. Feb 2018 13:18

AW: TTimer nicht Thread-safe
 
Zitat:

Zitat von himitsu (Beitrag 1393206)
Mit TTimer geht es nunmal nicht im Thread

Mein Problem ist momentan eher, dass ich ausserhalb des Threads einen riesigen Timer-gesteuerten Ablauf je nach Thread-Ergebnis an- oder ausschalten muss.
Den kann/moechte ich gar nicht komplett im Thread unterbringen, da dieser Ablauf noch an zig anderen Stellen im Code regulaer verwendet wird.

Ich muesste den Timer ausserhalb eben nur aus dem Thread anstossen.

Darf ich das mit .Queue?

himitsu 6. Feb 2018 13:21

AW: TTimer nicht Thread-safe
 
Delphi-Referenz durchsuchenTThread.Synchronize oder Delphi-Referenz durchsuchenTThread.Queue ... wird beides im Hauptthread ausgeführt.

MSDN-Library durchsuchenSendMessage und MSDN-Library durchsuchenPostMessage ebenso (wenn das zugehörige Window im Haupthtread erstellt wurde) und MSDN-Library durchsuchenPostThreadMessage sowieso.

Zacherl 6. Feb 2018 13:45

AW: TTimer nicht Thread-safe
 
Zitat:

Zitat von CCRDude (Beitrag 1393184)
Sleep in einem Thread ist auch nicht gut. Wenn das System runter fährt, benachrichtigt es Dein Programm, das muss sich in einer kurzen Zeit beenden können, sonst wird es als eingefroren angezeigt.

Das kann man umgehen, indem man statt
Delphi-Quellcode:
Sleep
einfach MSDN-Library durchsuchenWaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung
Delphi-Quellcode:
TEvent
) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die
Delphi-Quellcode:
WM_QUERYENDSESSION
bzw.
Delphi-Quellcode:
WM_ENDSESSION
Nachricht erhält. Sobald man das Event dann aktiviert, arbeiten alle Threads unmittelbar weiter, ohne auf das Timeout zu warten. Im Thread selbst sollte man dann noch die Rückgabe von
Delphi-Quellcode:
WaitForSingleObject
prüfen, und die Bearbeitung entsprechend sofort einstellen, wenn nicht
Delphi-Quellcode:
WAIT_TIMEOUT
zurückgegeben wurde.

CCRDude 6. Feb 2018 17:24

AW: TTimer nicht Thread-safe
 
Zitat:

Zitat von Zacherl (Beitrag 1393211)
Das kann man umgehen, indem man statt
Delphi-Quellcode:
Sleep
einfach MSDN-Library durchsuchenWaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung
Delphi-Quellcode:
TEvent
) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die
Delphi-Quellcode:
WM_QUERYENDSESSION
bzw.
Delphi-Quellcode:
WM_ENDSESSION
Nachricht erhält.

Noch praktischer: ich verwende eine von TThread abgeleitete Basis-Klasse, die dieses Warten als Methode anbietet und das Event im Terminate auslöst. Damit hilft das nicht nur beim Runterfahren Verzögerungen zu vermeiden, sondern auch beim schlichten Beenden des Programmes oder gar nur des Threads.

Zacherl 6. Feb 2018 17:58

AW: TTimer nicht Thread-safe
 
Zitat:

Zitat von CCRDude (Beitrag 1393234)
Zitat:

Zitat von Zacherl (Beitrag 1393211)
Das kann man umgehen, indem man statt
Delphi-Quellcode:
Sleep
einfach MSDN-Library durchsuchenWaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung
Delphi-Quellcode:
TEvent
) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die
Delphi-Quellcode:
WM_QUERYENDSESSION
bzw.
Delphi-Quellcode:
WM_ENDSESSION
Nachricht erhält.

Noch praktischer: ich verwende eine von TThread abgeleitete Basis-Klasse, die dieses Warten als Methode anbietet und das Event im Terminate auslöst. Damit hilft das nicht nur beim Runterfahren Verzögerungen zu vermeiden, sondern auch beim schlichten Beenden des Programmes oder gar nur des Threads.

Ja, genau so hatte ich es damals auch umgesetzt und dafür die
Delphi-Quellcode:
TerminatedSet
Methode überschrieben :thumb:


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

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-2025 by Thomas Breitkreuz