Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Thread schlafen legen


G-man - Di 24.02.04 16:29
Titel: Thread schlafen legen
Moin,
weiß einer von euch, wie man einen Thread für eine bestimmte Zeit mitten in der Arbeit ruhen lassen kann?
Ich habe schon lange darüber nachgedacht aber mir ist partout nichts eingefallen.


rokdd - Di 24.02.04 16:42

hallon
den thread steuerst du mit Resume und Suspend. wenn du nach einer bestimmten zeit in wieder loslegen lassen willst, musst du zwischen stoppen und wiederstarten Sleep oder einen Timer benutzen...

Hoffe dir geholfen zu haben

rokdd


G-man - Di 24.02.04 17:09

Wird mir Sleep nicht die ganze Anwendung "schlafen gelegt"?


rokdd - Di 24.02.04 17:12

ja, ware ja uch nur eine variante, weiß ja nicht was du machen willst...

rokdd


G-man - Di 24.02.04 17:35

Na ich will halt einen Thread mitten im Programm für eine bestimmte Zeit lahm legen, sodass er nichts mehr verarbeitet.


rokdd - Di 24.02.04 17:43

weiß ich doch! dann musst du folgenden programmabluaf nutzen(kann aber auch noch andere geben:
1.thread stoppen mit suspend
2. timer x starten
3. nach intervall von timer x:
3.1 timer deaktivieren
3.2 thread fortsetzen mit resume!

Rokdd


AndyB - Di 24.02.04 18:55

G-man hat folgendes geschrieben:
Wird mir Sleep nicht die ganze Anwendung "schlafen gelegt"?

Nein. Sleep() legt den aktuellen Thread schlafen. Wenn das natürlich der Hauptthread ist, dann steht die Messageloop.

Von Suspend sollte man die Finger lassen, denn man kann nicht bestimmen, wo der Thread nun angehalten werden soll und das kann so weit gehen, das deadlocks entstehen, weil ein Synchronisierungs-Objekt (Mutex/Semaphore/...) gerade angefordert und noch nicht zurückgegeben wurde. Das ist auch der Grund, warum es unter Linux bei den POSIX Threads kein Suspend gibt. Borland hat es zwar geschafft diese nachzubilden, jedoch nur nur durch einen Hack, der bei neueren Kernel zu Fehler führt, die bis zur Programmterminierung gehen können.


rokdd - Di 24.02.04 18:58

Sorry wusste ich nicht, bei mir hat es bis jetzt immer funktioniert...

Rokdd