![]() |
TThread Suspend und Resume
Hallo zusammen!
Ich ärgere mich mal wieder mit der Threadprogrammierung herum, ist für mich immer noch steiniges Neuland ^^ Ich habe ein TThread-Objekt, das in der Execute-Prozedur eigentlich alles macht was ich will. Allerdings nur beim ersten Resume. Ein zweites Resume führt nicht wieder zur Ausführung des Execute-Codes. Das TThread-Objekt wurde Suspended erzeugt und FreeOnTerminate ist FALSE. Ich möchte den Thread so verwenden, dass er praktisch die meiste Zeit schlafend im Hintergrund liegt. Ab und zu werden durch Nutzeraktion bestimmte Aufgaben erstellt, die der Thread im Hintergrund abarbeitet. Eine Interaktion mit dem Mainthread findet nicht statt.
Delphi-Quellcode:
Oder mache ich hier einen Denkfehler und TThreads lassen sich gar nicht auf diese Weise "recyclen" so dass ich das Threadobjekt prinzipiell freen und bei Vorliegen neuer Actions (nicht im Sinne von TAction verstehen) ein neuer Thread erzeugt wird?
procedure TmyThreadObject.Execute;
var E: TmyAction; begin try while (not Terminated) and (Actions.Count > 0) do begin E:= Actions[0]; // Do some Code end; finally Suspend; end; end; Grüße Cody |
AW: TThread Suspend und Resume
Die Execute-Methode wird nur einmal ausgeführt.
Ist die durch, dann ist der Thread fertig und kann nicht wieder neu gestartet werden. Fazit: Eine Schleife einbauen :stupid: Grund: Das zweite Resume setzt den Thread nach dem "Suspend" fort und der Thread beendet sich dann, da er danach nichts mehr zu tun hat. Aber ich würde eher vom Pausieren abraten und stattdessen irgendein "WaitFor" da hin tun und dann mit Events abeiten. (Thread wartet, bis Event gefeuert wird) |
AW: TThread Suspend und Resume
Ich mache es immer so:
Delphi-Quellcode:
Soweit ich weis, sind Resume und Suspended doch veraltet.
while not Terminated do
begin if bThreadSollSchlafen then Sleep(1000); if bThreadBeenden then begin // Beende den Thread end else begin // Führe Code aus, der ausgeführt werden muss. end; end; |
AW: TThread Suspend und Resume
Ich schließe mich himi an.
Falls Du damit nicht zurecht kommst, kann ich mal etwas zusammenstellen. Habe das kürzlich auch erstmalig und erfolgreich eingesetzt. :-) |
AW: TThread Suspend und Resume
Das mit dem WaitFor würde mich jetzt aber auch interessieren.
Denn dann wird nicht mehr soviel Energie verbraten als mit den Sleeps. |
AW: TThread Suspend und Resume
Ich hoffe es wird nicht von außerhalb des Threads auf "Actions" zugegriffen.
Ohne entsprechende Absicherung wäre das ein guter Grund für unerklärliche Fehler und Programmabstürze. |
AW: TThread Suspend und Resume
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe Ihr seit beide auf den Delphitage... Da gibt es einen Vortrag zu diesem Thema...
auf die Schnelle
Delphi-Quellcode:
Mavarik
while not(Terminated) do
begin try FRunning := false; // Atom E_Event.WaitFor(FTimeOut); if FCancelRequest or Terminated then exit; FRunning := true; // Code der ausgeführt werden soll except end; end; PS.: Und eine alte Unit für Delphi-User ohne System.Threading oder für Threads die im nano-Sekundenbereiche starten müssen... Einfache eine eigene Klasse davon ableiten und die abstrakten Proceduren überschreiben... |
AW: TThread Suspend und Resume
Zitat:
Kein Anderer weiß wo der Thread gerade ist und kann somit den Thread auch nicht "sicher" anhalten. (sich selber anhalten könnte ein Thread sich schon dürfen, aber da gibt es andere/bessere Wege) Sicher = nicht an ein "ungünstigen" Stelle Suspended starten erstellen und dann später starten ist schon noch OK, auch wenn sich die Befehle/Namen von Suspend/Resume vielleicht geändert haben mögen. :angle: Zitat:
Aber es geht sofort weiter (hier muß man immer bis zu 1000 Millisekunden warten, bis es weiter geht) und der Thread wacht nicht ständig sinnlos zwischendurch auf ... erst, wenn das Event oder der TimeOut ausgelöst haben. PS: FCancelRequest oder bThreadBeenden sind doch bissl doppelt, vor allem dann, wenn man daran denkt was Terminated schon macht. :zwinker: |
AW: TThread Suspend und Resume
Zitat:
|
AW: TThread Suspend und Resume
Da auch bei einem Sleep(1) ein "wartender" Thread zu 0% CPU Auslastung führt, habe ich das bisher immer genommen. Bei mir sehen die Execute-Methoden meist so aus:
Delphi-Quellcode:
procedure TMyThread.Execute;
var ... begin while not Terminated do begin try try if FWaiting then Sleep(1) else begin // Eigentlicher Thread-Code // (setzt ggf. FWaiting selbst auf true wenn die Aufgabe durch ist, // da ein Bool aber atomar ist, kann dies auch von aussen passieren) end; except on ... end; finally ... end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 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 by Thomas Breitkreuz