AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread: Suspend und Resume deprecated

Ein Thema von MiKaEr · begonnen am 4. Feb 2012 · letzter Beitrag vom 5. Feb 2012
Antwort Antwort
MiKaEr
(Gast)

n/a Beiträge
 
#1

Thread: Suspend und Resume deprecated

  Alt 4. Feb 2012, 22:45
hallo,

ich beschäftige mich schon länger mit threads. jedoch habe ich eine wichtige frage:
wenn ich einen thread starte und danach pausiere, mache ich das per suspend. das ist aber deprecated. was nutze ich alternativ:

noch wichtiger:
ich erwecke ihn nachher wieder mit resume. das ist aber auch deprecated. es wird empfohlen, stattdessen start zu nehmen. aber wenn ein thread bereits gestartet wurde unc ich nach suspend > start verwende, bekomme ich eine AV. ich kann einen gestartetetn thread nicht erneut starten, das ist das problem.

was ist die funktionierende alternative zu resume?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Thread: Suspend und Resume deprecated

  Alt 4. Feb 2012, 22:50
Das macht man eben nicht!

Genau deswegen ist Suspend auch endlich deprecated.

Denn von außerhalb kann man nicht sicherestellen, daß der Thread in einem "sicheren" Zustand angehalten wird.
Das kannst du maximal von innerhalb des Threads sicherstellen, indem er sich selber anhält, an einer definierten Stelle,
oder wenn er von Anfang an Suspend ist (Parameter im Constructor).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu ( 4. Feb 2012 um 22:53 Uhr)
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#3

AW: Thread: Suspend und Resume deprecated

  Alt 4. Feb 2012, 22:53
wenn ich einen thread starte und danach pausiere, mache ich das per suspend. das ist aber deprecated.

ich erwecke ihn nachher wieder mit resume. das ist aber auch deprecated.
Hallo,

also ich nutze dazu immer eine Variable, die eben in Execute abgefragt und "von außen" gesetzt wird

Delphi-Quellcode:
type TMyThread = class(TThread)
  private
    FSleep : Boolean;
    FTerminated : Boolean;
  public
    procedure Execute; override;
    procedure GoToSleep;
    procedure WakeUp;
end;

procedure TMyThread.Execute;
begin
  while not (FTerminated) do
  begin
    if not (FSleep) do
    begin
      //Befehle abarbeiten
    end
    else
      Sleep(10);
  end;
end;

procedure TMyThread.GoToSleep;
begin
  FSleep := True;
end;

procedure TMyThread.WakeUp;
begin
  FSleep := False;
end;
nach bestem Wissen und Gewissen, aber ohne IDE aus dem Kopf runtergeschrieben

OK, das ist ein klein wenig anders, als den Thread wirklich "stillzulegen", aber wenn ich mich richtig erinnere, dann wurde dieses Verfahren auch hier schon empfohlen

edit2: richtig, hier war's gewesen
http://www.delphipraxis.net/149714-w...-veraltet.html

edit:
Huch, der rote Kasten war zwar da, aber meine Meinung will ich Euch trotzdem nicht vorenthalten
Tobias
Bitte nicht hauen , ich weiß es nicht besser

Geändert von silver-moon-2000 ( 4. Feb 2012 um 23:07 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.916 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Thread: Suspend und Resume deprecated

  Alt 5. Feb 2012, 09:52
Eine alternative Lösung für das Suuspend / Resume Problem ist in den Indy Komponenten in der Unit IdThread enthalten.

Sie enthält eine Threadklasse (TIdThread), deren Execute Methode in einer Schleife liegt und deren Ausführung man von aussen leicht anhalten und wieder aufnehmen kann.

TIdThread hat kaum externe Abhängigkeiten und kann daher auch leicht modifiziert ohne Indy verwendet werden.

Funktioniert ab Delphi 5, ich selber nutze sie auch mit Delphi 6 und bisher problemlos.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.459 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Thread: Suspend und Resume deprecated

  Alt 5. Feb 2012, 10:03
In meinem aktuellen Projekt mache ich das über ein Event.
Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    FEvent: THandle;
    ...
  public
    procedure SuspendWork;
    procedure ContinueWork;
    ...
  end;

constructor TMyThread.Create;
begin
  (* Non-Signaled-Event anlegen *)
  FEvent := CreateEvent(nil, true, false, '');
  ...
end;

procedure TMyThread.ContinueWork;
begin
  (* Event auf Non-Signaled zurücksetzen *)
  ResetEvent(FEvent);
end;

procedure TMyThread.Execute;
begin
  ...
  (* Falls Event Signaled ist, warten *)
  while (WaitForSingleObject(FEvent, 0) = WAIT_OBJECT_0) and
    not Terminated do
    sleep(0);
  if Terminated then
    break;
  ...
end;

procedure TMyThread.SuspendWork;
begin
  (* Event auf Signaled setzen *)
  SetEvent(FEvent);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.916 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Thread: Suspend und Resume deprecated

  Alt 5. Feb 2012, 10:25
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  ...
  (* Falls Event Signaled ist, warten *)
  while (WaitForSingleObject(FEvent, 0) = WAIT_OBJECT_0) and
    not Terminated do
    sleep(0);
  if Terminated then
    break;
  ...
end;
Gibt es eine elegantere Lösung als eine Schleife mit Sleep(0)?

Unter http://borland.newsgroups.archived.a...507263541.html werden Sleep(0)-Schleifen als "low-priority-thread-killing, processor-eating" bezeichnet (was ich frei übersetze als "blockiert Threads niedrigerer Priorität, und frisst Prozessorzeit"). (Punkt 5)
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Thread: Suspend und Resume deprecated

  Alt 5. Feb 2012, 10:36
Rate mal, wofür man dort ein TimeOut angeben kann.
WaitFor wartet auf das Event und will man nebenbei noch Eventunabhängig z.B. noch das Terminated prüfen, dann ginge das darüber.

Über das TimeOut hat man quasi ein Sleep, welches regelmäßige Auswertungen erlaubt, den Thread meistens schlafen läßt (CPU-Entlastung) und gleichzeitig dennoch, über das Event, schnell reagieren kann.

Siehe DelayDelay.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Thread: Suspend und Resume deprecated

  Alt 5. Feb 2012, 10:41
Klar geht das eleganter:
Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    FEvent: THandle;
    ...
  public
    destructor Destroy; override;
    procedure Terminate; override;
    procedure SuspendWork;
    procedure ContinueWork;
    ...
  end;

procedure TMyThread.Terminate;
begin
  inherited;
  SetEvent( FEvent );
end;

destructor TMyThread.Destroy;
begin
  if not Terminated then
    begin
      Terminate;
      WaitFor;
    end;
  inherited;
end;

constructor TMyThread.Create;
begin
  (* Signaled-Event anlegen *)
  FEvent := CreateEvent(nil, true, true, '');
  ...
end;

procedure TMyThread.ContinueWork;
begin
  (* Event auf Signaled setzen *)
  SetEvent(FEvent);
end;

procedure TMyThread.Execute;
begin
  while not Terminated do
    begin

      (* Falls Event Non-Signaled ist, warten *)
      if
         ( WaitForSingleObject( FEvent, INFINITE ) = WAIT_OBJECT_0 ) and
         not Terminated
      then
        begin

          // Hier jetzt das rein, was der Thread abarbeiten soll

        end;

    end;
end;

procedure TMyThread.SuspendWork;
begin
  (* Event auf Non-Signaled setzen *)
  ResetEvent(FEvent);
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Thread: Suspend und Resume deprecated

  Alt 5. Feb 2012, 12:56
WaitForSingleObject kehrt auch zurück, wenn man das Handle mit CloseHandle schließt, d.h. man muss nicht unbedingt Terminate überschreiben.
Das geht nebenbei bei älteren Delphi-Versionen gar nicht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf