AGB  ·  Datenschutz  ·  Impressum  







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

W1000 Symbol 'Resume' ist veraltet ????

Ein Thema von RaSoWa1 · begonnen am 28. Mär 2010 · letzter Beitrag vom 24. Aug 2011
Antwort Antwort
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#1

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 22. Aug 2011, 23:01
Hmm.. wenn property Terminated wie in älteren Versionen ReadOnly ist und .Start das scheinbar auch nicht zurücksetzt ist es natürlich keine Lösung - dann kann man den Thread auch freigeben und einen neuen erzeugen.. das Konzept scheint mal wieder sehr gut durchdacht zu sein

Idee:
Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    FHalted: Boolean;
    procedure SuspendIfHalted;
  public
    procedure Halt;
    procedure Continue;
  end;

  procedure TMyThread.Halt;
  begin
    FHalted := True;
  end;

  procedure TMyThread.Continue;
  begin
    FHalted := False;
    ResumeThread(Handle);
  end;

  procedure TMyThread.SuspendIfHalted;
  begin
    if FHalted then
      SuspendThread(Handle);
  end;

  procedure TMyThread.Execute;
  begin
    repeat
      EntercriticalSection;
      ..
      LeaveCriticalSection;
      ..
      //sichere Warteposition ausserhalb Lock
      SuspendIfHalted;
    until Terminated;
  end;
Zu jedem "Terminate" gehört dann natürlich ein "Continue" um den Thread ggf. aufzuwecken.

Alternativ zu SuspendIfHalted ohne echtes Suspend-/ResumeThread:
while FHalted and not Terminated do Sleep(10);

Grüsse, Dirk
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 22. Aug 2011, 23:25
Danke für dein Beispiel .. Werde mir das mal anschauen in Ruhe.

Mein Problem ist folgendes
Delphi-Quellcode:
  procedure TMyThread.Execute;
  begin
    repeat
      EntercriticalSection;
      ..
      LeaveCriticalSection;
      ..
      //sichere Warteposition ausserhalb Lock
      SuspendIfHalted;
    until Terminated;
  end;
So wie hier wartest du auch auf Terminate..
Der Thread läuft also so lange bis der Zustand Terminate eintritt.

Wenn ich nun anstelle von Suspend.. Terminate verwende so wie vorgeschlagen
dann beendet sich logischerweise der Thread das hat zur folge das ich anschließend kein Plugin mehr starten kann.

MeinThread.Suspend hält den Thread ja nur an und beendet ihn nicht so wie Terminate das tut.

Damit stehe ich im Konflikt zu der Aussage anstelle von Suspend! Terminate zu verwenden.
Na ja und wie MeinThread.Start im vergleich zu MeinThread.Resume steht das ist auch noch fraglisch.

gruss
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#3

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 22. Aug 2011, 23:32
Das Suspend würde ich nicht durch Terminate ersetzen, das funzt halt einfach nicht.

Das "gefähliche" Suspend von aussen würde ich halt vermeiden indem ich nur ein Flag setze über welches der Thread sich zu einem sicheren Zeitpunkt (wenn er gerade nichts blockiert) selber unterbricht. Das Fortsetzen (ResumeThread) ist dann unkritisch.

Grüsse, Dirk
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 22. Aug 2011, 23:38
Das Suspend würde ich nicht durch Terminate ersetzen, das funzt halt einfach nicht.

Das "gefähliche" Suspend von aussen würde ich halt vermeiden indem ich nur ein Flag setze über welches der Thread sich zu einem sicheren Zeitpunkt (wenn er gerade nichts blockiert) selber unterbricht. Das Fortsetzen (ResumeThread) ist dann unkritisch.

Grüsse, Dirk
Ist schon seltsam das man sich selbst noch funktionen basteln muss, darauf hingewiesen wird das Resume veraltet ist
aber keine Anwendbare lösung dafür zur verfügung stellt.

Werd wohl nicht drum rum kommen da selbst was zu basteln.

Danke.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.848 Beiträge
 
Delphi 12 Athens
 
#5

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 06:04
Naja, die ganze Konstruktion mit Suspend und Resume war eben potentiell gefährlich.

Deshalb ist es besser da etwas individuell auf den konkreten Fall angepasst zu schreiben als etwas einfaches zu nutzen, das zu schwer zu findenden massiven Problemen (wie schon genannt Deadlocks) führen kann.

Zumal man den Ablauf dabei auch gleich viel besser optimieren kann.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 06:46
... darauf hingewiesen wird das Resume veraltet ist
aber keine Anwendbare lösung dafür zur verfügung stellt.
Das würde ich so nicht ganz behaupten.

Delphi-Quellcode:
    // This function is not intended to be used for thread synchronization.
    procedure Resume; deprecated;
    // Use Start after creating a suspended thread.
    procedure Start;
    // This function is not intended to be used for thread synchronization.
    procedure Suspend; deprecated;
Wobei die D2010-OH diesbezüglich wirklich schrottig ist,
denn bei Delphi-Referenz durchsuchenTThread.Suspend und Delphi-Referenz durchsuchenTThread.Resume wird nicht erwähnt, daß diese "alt" sind,
aber bei Delphi-Referenz durchsuchenTThread.Start steht wenigstens
Zitat:
Anmerkung: Die Methode Resume ist veraltet und seine Verwendung soll vermieden werden. Verwenden Sie stattdessen die Methode Start.
Nur wie soll man das eigentlich entdecken, wenn man eigentlich nach Resume sucht?

Außerdem gehört eine Erklärung in die OH, warum diese sooo gefährlich und nun auch deprecated sind.


[add]
OK, in XE hat man dieses ja nun endlich mal beseitigt. (schön, daß "alte" Versionen so selten geupdatet werde)

Zitat:
...

Setzt die Ausführung eines unterbrochenen Threads fort. Resume sollte von den Debuggern verwendet werden und ist in RAD Studio XE 2010 veraltet.

Mit Resume nehmen Sie die Ausführung eines Thread wieder auf. Suspend-Aufrufe können verschachtelt sein. Entsprechend oft muss dann aber auch Resume aufgerufen werden, bevor der Thread fortgeführt wird.

Mit der Methode Start können Sie die Ausführung eines neu erstellten und angehaltenen Threads aufnehmen.

Warnung: Die Methoden Resume und Suspend sollten nur für das Debuggen verwendet werden. Das Anhalten eines Threads mit Hilfe von Suspend kann zu Deadlocks und undefiniertem Verhalten in der Anwendung führen. Korrekte Thread-Synchronisierungen sollten mit TEvent und TMutex vorgenommen werden.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (23. Aug 2011 um 06:50 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 12:47
Zitat:
Das würde ich so nicht ganz behaupten.
ja wo steckt denn nun die Lösung in den 3 Zeilen ?

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: W1000 Symbol 'Resume' ist veraltet ????

  Alt 23. Aug 2011, 13:02
Statt .Resume nutzt man jetzt .Start
und .Suspend gibt es nicht mehr ... auch keinen Ersatz dafür.

Zum Anhalten kannst du ein Event, eine CriticalSection oder sonstwas verwenden, welches den Thread an einer definierten Stelle anhält und dir bescheid gibt, wenn angehalten wurde.



OK, es wäre ja schön gewesen, wenn Emba solche Funktionen gleich eingebaut hätte und man es nicht selber implementieren müßte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:05 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