Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Warten auf Antwort mit Hilfe von Threads (Timeout)


alkan - Do 07.08.08 20:28
Titel: Warten auf Antwort mit Hilfe von Threads (Timeout)
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 - 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:

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


Martok - 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