![]() |
Delphi-Version: 10 Seattle
TTimer nicht Thread-safe
In diesem SO-Thread schreiben die Antwortenden, dass man TTimer in Threads vermeiden sollte:
![]() Meine Frage zu dieser Sachlage: Wenn der TTimer im Thread-Objekt liegt und aktiviert wird, sind AV's nicht auszuschliessen; Was ist, wenn das TTimer-Objekt ausserhalb des Threads in einem Objekt im Haupt-Programm liegt, erstellt wird und nur aus einem Thread angestossen wird? |
AW: TTimer nicht Thread-safe
Auch schlecht. Man greift aus einem Thread nicht auf Objekte außerhalb des Threads zu.
Erst Recht nicht auf VCL Komponenten. Warum brauchst du überhaupt einen Timer in einem Thread? Kannst du dir doch quasi im Thread selbst bauen oder nicht? Da es ja nur ein Thread ist kannst du ja einfach ne Schleife mit sleeps machen oder? |
AW: TTimer nicht Thread-safe
Es könnte hilfreich sein, deine Anforderung zu beschreiben, dann kann man dir eventuell besser Hinweise geben, wie du es lösen kannst.
|
AW: TTimer nicht Thread-safe
Danke fuer die Hinweise.
Ja, ich kann es auch mit Sleep loesen. |
AW: TTimer nicht Thread-safe
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.
Und auch wenn der Benutzer Dein Programm schließt, will er nicht erst warten, bis ein Sleep in irgend einem Thread beendet ist (mal davon ausgehend, dass Du beim Beenden des Programmes mit den Threads ordentlich aufräumst). WaitForSingleObject eignet z.B. sich wunderbar, um auf Ablauf einer Frist aber eben auch alternativ auf ein Signal zu reagieren, damit hängt der Thread dann bei seiner Auflösung auch nicht mehr lästig. |
AW: TTimer nicht Thread-safe
Zitat:
Ansonsten beendet sich das Programm direkt :wink: |
AW: TTimer nicht Thread-safe
Zitat:
Eine TForm hat eine Status-Anzeige einer Verbindung. Die Verbindung wird selbstverstaendlich Threaded aufgebaut, damit die Anwendung nicht einfriert. Die Status-Anzeige der TForm soll anzeigen, ob der Verbindungs-Aufbau gerade in der Suche ist, oder bereits erfolgreich war. Ist es so ueberhaupt vermeidbar, aus dem Thread auf die VCL-Statusanzeige zuzugreifen? |
AW: TTimer nicht Thread-safe
Man könnte hier doch einen Timer nutzen um den aktuellen Zustand des Threads in der Statusbar anzuzeigen.
Der Timer wäre damit nicht in dem Thread sondern in der GUI. Alternativ kann man auch eine message an das Hautpfenster von Thread aus schicken, asynchron mit PostMessage. Diueses kann dann updaten wenn es idle ist. |
AW: TTimer nicht Thread-safe
Laut der Antwort in
![]() Kann man infolge dessen nicht auch den Anstoss eines TTimers aus einem TThread ohne AV-Gefahr .Queue'en? |
AW: TTimer nicht Thread-safe
Wenn Threads irgendwas nach außen zu funken haben, dann bekommen sie callbacks, die man entsprechend synchronisieren kann.
Wenns komplexer wird, dann einfach OTL oder so nutzen, da gibt es zig Mechaniken. Zitat:
|
AW: TTimer nicht Thread-safe
Mit TTimer geht es nunmal nicht im Thread, aber natürlich kann man
![]() * 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 |
AW: TTimer nicht Thread-safe
Zitat:
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? |
AW: TTimer nicht Thread-safe
![]() ![]() ![]() ![]() ![]() |
AW: TTimer nicht Thread-safe
Zitat:
Delphi-Quellcode:
einfach
Sleep
![]()
Delphi-Quellcode:
) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die
TEvent
Delphi-Quellcode:
bzw.
WM_QUERYENDSESSION
Delphi-Quellcode:
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
WM_ENDSESSION
Delphi-Quellcode:
prüfen, und die Bearbeitung entsprechend sofort einstellen, wenn nicht
WaitForSingleObject
Delphi-Quellcode:
zurückgegeben wurde.
WAIT_TIMEOUT
|
AW: TTimer nicht Thread-safe
Zitat:
|
AW: TTimer nicht Thread-safe
Zitat:
Delphi-Quellcode:
Methode überschrieben :thumb:
TerminatedSet
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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-2025 by Thomas Breitkreuz