Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Thread + Timer, Einbinden von TimerThread.pas (https://www.delphipraxis.net/181814-thread-timer-einbinden-von-timerthread-pas.html)

Mavarik 2. Jan 2018 09:43

AW: Thread + Timer, Einbinden von TimerThread.pas
 
Zitat:

Zitat von LTE5 (Beitrag 1390065)
Nur.. mit Events eben.. und nicht mit Sleep?

emm... Ja genau das macht ja den Unterschied...

LTE5 2. Jan 2018 12:07

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?

Delphi.Narium 2. Jan 2018 12:22

AW: Thread + Timer, Einbinden von TimerThread.pas
 
Delphi-Quellcode:
Interval := 5 * 60 * 60 * 1000;
5 Stunden * 60 Minuten * 60 Sekunden * 1000 Millisekunden?

Und wenn er dann wach wird, Interval auf den dann gewünschten Zeitraum setzen?

Mavarik 2. Jan 2018 12:38

AW: Thread + Timer, Einbinden von TimerThread.pas
 
Zitat:

Zitat von LTE5 (Beitrag 1390084)
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?

5h ist natürlich schon eine Spanne.

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.

LTE5 2. Jan 2018 12:40

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;

Mavarik 2. Jan 2018 12:51

AW: Thread + Timer, Einbinden von TimerThread.pas
 
Zitat:

Zitat von LTE5 (Beitrag 1390090)
Ich verstehe ehrlich gesagt den Sinn von Events in diesem Falle nicht.
Warum nicht einfach einen Sleep und fertig?

Ganz einfach. Es geht nur darum möglichst wenig CPU Zeit zu verbrennen.

LTE5 2. Jan 2018 12:58

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.

Delphi.Narium 2. Jan 2018 13:01

AW: Thread + Timer, Einbinden von TimerThread.pas
 
Siehe hier: http://www.delphipraxis.net/1270100-post13.html

Du weist Interval die gewünschte Zeitspanne zu. Die wird dann im Execute von selbst berücksichtigt.

Ein Beispiel dazu: http://www.delphipraxis.net/929219-post1.html

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;

LTE5 2. Jan 2018 13:11

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.

LTE5 3. Jan 2018 12:59

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:
// Sleep(1000);
res := FEvent.WaitFor(FInterval); // also z.B. 1000

// was zu tun
ist es nicht vollkommen egal, ob WaitFor oder Sleep? Nach 1000 ms gehts doch eh weiter und CPU-Zeit wird verbraten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.
Seite 2 von 5     12 34     Letzte »    

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