AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TTimer nicht Thread-safe

Ein Thema von hzzm · begonnen am 6. Feb 2018 · letzter Beitrag vom 6. Feb 2018
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#11

AW: TTimer nicht Thread-safe

  Alt 6. Feb 2018, 13:50
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
$2B or not $2B
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#12

AW: TTimer nicht Thread-safe

  Alt 6. Feb 2018, 14:18
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: TTimer nicht Thread-safe

  Alt 6. Feb 2018, 14:21
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: TTimer nicht Thread-safe

  Alt 6. Feb 2018, 14:45
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 Sleep einfach MSDN-Library durchsuchenWaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung TEvent ) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die WM_QUERYENDSESSION bzw. 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 WaitForSingleObject prüfen, und die Bearbeitung entsprechend sofort einstellen, wenn nicht WAIT_TIMEOUT zurückgegeben wurde.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#15

AW: TTimer nicht Thread-safe

  Alt 6. Feb 2018, 18:24
Das kann man umgehen, indem man statt Sleep einfach MSDN-Library durchsuchenWaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung TEvent ) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die WM_QUERYENDSESSION bzw. 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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: TTimer nicht Thread-safe

  Alt 6. Feb 2018, 18:58
Das kann man umgehen, indem man statt Sleep einfach MSDN-Library durchsuchenWaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung TEvent ) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die WM_QUERYENDSESSION bzw. 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 TerminatedSet Methode überschrieben
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20:11 Uhr.
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