Autor Beitrag
alkan
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 07.08.08 20:28 
Wie kann ich erreichen, dass ein Thread suspendiert wird, aber nach einer bestimmten Zeit (Timeout) automatisch weiterläuft?

Das Problem mit Sleep() ist ja, dass der Thread dann auf jeden Fall die angegebene Zeitspanne abwartet. Ich möchte aber unbedingt, dass der Thread nach einem Resume sofort weitergeht. (Konkret geht es um ein Abwarten einer Antwort in einer Netzwerkanwendung, verbunden mit einem fixen Timeout).

Gibt es dafür eine einfache Möglichkeit?

Vielen Dank im Voraus.


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Do 07.08.2008 um 20:35
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mo 11.08.08 13:55 
Wenn du es nicht mit einem Sleep, sondern einer SChleife löst?

Der Thread würde dann statt sleep sowas ausführen:
ausblenden Delphi-Quelltext
1:
2:
3:
repeat
sleep(50);
until GoForward;


...wobei GoForward eine synchronisierte Abfrage auf eine Boolean-Variable ist, die im Mainthread gesetzt werden kann.
Evtl. kanst du ja dann noch die Thread-Priorität zeitweise heruntersetzen um mit der SChleife nicht zu viel Leistung zu verheizen. Kommt drauf an, wie zeitkritisch deine Sache ist

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 11.08.08 15:40 
Hm... ne user profile iconalias5000, Busy-Waiting wäre hier aber der allerletzte Versuch ;)

Ich würde das so machen: SynchronisationsObjekt erstellen (Event,Semaphore)
Das setzt der Thread und wartet dann mit WaitForSingleObject() und Timeout-Angabe drauf.
Wenn er weiter darf wird das Objekt von der Datenquelle (dem anderen Thread) resettet und schon macht der erste weiter.

Am Result von WaitForSingleObject kann man feststellen ob es ein Timeout war oder das Objekt verfügbar geworden ist.

cu
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."