![]() |
AW: Thread + Timer, Einbinden von TimerThread.pas
Zitat:
|
AW: Thread + Timer, Einbinden von TimerThread.pas
Angenommen ich möchte einen Thread 5 Stunden schlafen legen und er soll nach diesen 5 Stunden alleine aufwachen.
Wie bewerkstellige ich das ohne Sleep? |
AW: Thread + Timer, Einbinden von TimerThread.pas
Delphi-Quellcode:
5 Stunden * 60 Minuten * 60 Sekunden * 1000 Millisekunden?
Interval := 5 * 60 * 60 * 1000;
Und wenn er dann wach wird, Interval auf den dann gewünschten Zeitraum setzen? |
AW: Thread + Timer, Einbinden von TimerThread.pas
Zitat:
Ich würde mir in so einen Fall einen Timeout von X Minuten setzen und dann immer in einer Liste nachschauen ob ein Event ansteht. Beispiel: ThreadTimeout auf 1h... Wenn der nächste Termin < 1h ist setze ich den Timeout auf "Restzeit" dann habe ich einen Event der genau feuert. Das gleiche, wenn ein neuer Event in die Liste kommt. |
AW: Thread + Timer, Einbinden von TimerThread.pas
Ich verstehe ehrlich gesagt den Sinn von Events in diesem Falle nicht.
Warum nicht einfach einen Sleep und fertig? Wie sieht denn dieses Beispiel mit der Event-Thread-Ableitung aus? Vielleicht kapiere ich es dann. Die 5 Stunden waren nur ein Beispiel.
Delphi-Quellcode:
procedure TMyNormalThread.Execute;
begin while not Terminated do begin Sleep(1000); if 1 = 2 then // viel zu tun end; end; |
AW: Thread + Timer, Einbinden von TimerThread.pas
Zitat:
|
AW: Thread + Timer, Einbinden von TimerThread.pas
Das verstehe ich jetzt. Könntest du das Minimalbeispiel oben eventuell umändern? Vielleicht verstehe ich dann auch den Rest und die Handhabe generell.
|
AW: Thread + Timer, Einbinden von TimerThread.pas
Siehe hier:
![]() Du weist Interval die gewünschte Zeitspanne zu. Die wird dann im Execute von selbst berücksichtigt. Ein Beispiel dazu: ![]() Also grob geraten, da ungetestet:
Delphi-Quellcode:
procedure TMyNormalThread.Execute;
var res : TWaitResult; begin while not Terminated do begin // Sleep(1000); res := FEvent.WaitFor(FInterval); // also z.B. 1000 // if 1 = 2 then // viel zu tun // end; case res of wrSignaled : if 1 = 2 then begin // viel zu tun end; wrTimeout : ; wrAbandoned : Terminate; wrError : { Fehler loggen }; end; end; end; |
AW: Thread + Timer, Einbinden von TimerThread.pas
Ich probiere das gleich mal aus! Danke.
Habe mich anders entschieden. Ist mir den Aufwand nicht wert. Ich belasse alles so wie es aktuell ist. Mit Sleep fahre ich gut. Außerdem kapier ich das eh nicht. |
AW: Thread + Timer, Einbinden von TimerThread.pas
Mich intertessiert aber trotzdem noch wie man so einen Thread aufweckt und schlafen legt.
Und wie man auf Terminate reagiert und ob man in WaitFor festhängt. Und woher kommt das Ergebnis von FEvent.WaitFor? Muss man das von Außen setzen? Am wichtigsten ist aber die Frage was überhaupt der Unterschied ist
Delphi-Quellcode:
ist es nicht vollkommen egal, ob WaitFor oder Sleep? Nach 1000 ms gehts doch eh weiter und CPU-Zeit wird verbraten.
// Sleep(1000);
res := FEvent.WaitFor(FInterval); // also z.B. 1000 // was zu tun |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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