AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread Suspend und Resume

Ein Thema von Codehunter · begonnen am 14. Sep 2016 · letzter Beitrag vom 15. Sep 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

TThread Suspend und Resume

  Alt 14. Sep 2016, 15:48
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:
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;
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?

Grüße
Cody
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 15:55
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
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#3

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 15:55
Ich mache es immer so:

Delphi-Quellcode:
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;
Soweit ich weis, sind Resume und Suspended doch veraltet.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 16:28
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#5

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 16:39
Das mit dem WaitFor würde mich jetzt aber auch interessieren.
Denn dann wird nicht mehr soviel Energie verbraten als mit den Sleeps.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 16:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 17:00
Ich hoffe Ihr seit beide auf den Delphitage... Da gibt es einen Vortrag zu diesem Thema...

auf die Schnelle

Delphi-Quellcode:
  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;
Mavarik

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...
Angehängte Dateien
Dateityp: pas UseMyThread.pas (2,9 KB, 35x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 20:01
Soweit ich weis, sind Resume und Suspended doch veraltet.
Nunja, das Einzige, was man niemals machen darf, ist ein Suspend von außerhalb des Threads.
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.

Das mit dem WaitFor würde mich jetzt aber auch interessieren.
Denn dann wird nicht mehr soviel Energie verbraten als mit den Sleeps.
Sleep macht intern auch "nur" ein WaitFor und wartet auf das TimeOut

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#9

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 20:08
Zitat:
Aber es geht sofort weiter (hier muß man immer bis zu 1000 Millisekunden warten, bis es weiter geht)
Ich warte immer 25ms. Ist schnell genug finde ich.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

AW: TThread Suspend und Resume

  Alt 14. Sep 2016, 22:12
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;
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr.
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