Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi W1000 Symbol 'Resume' ist veraltet ???? (https://www.delphipraxis.net/149714-w1000-symbol-resume-ist-veraltet.html)

RaSoWa1 28. Mär 2010 12:01


W1000 Symbol 'Resume' ist veraltet ????
 
Hallo,

bei einem Projekt in dem ich Threads verwende kommt jetzt mit D 2010 folgende Warnung:
Zitat:

[DCC Warnung] ClassAlbum.pas(2068): W1000 Symbol 'Resume' ist veraltet
Lt. Online-Hilfe soll zum Start des Threads aber Resume verwendet werden.

Ist das ein Bug in D 2010?

Gruß Klaus.

himitsu 28. Mär 2010 12:11

Re: W1000 Symbol 'Resume' ist veraltet ????
 
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;
Was ein Blick in die Sourcen so leisten kann. :angel2:

daywalker9 28. Mär 2010 12:11

Re: W1000 Symbol 'Resume' ist veraltet ????
 
Also wenn man bei Delphi selber guckt, steht dies im Source:
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;

RaSoWa1 28. Mär 2010 13:02

Re: W1000 Symbol 'Resume' ist veraltet ????
 
Danke an euch.

Also ein Bug der Online-Hilfe.
Denn da steht:
Zitat:

Classes.TThread.Create
.....
Mit Create erzeugen Sie einen Thread in einer Anwendung. Wenn CreateSuspended den Wert false hat, wird Execute sofort aufgerufen. Andernfalls erfolgt der Aufruf erst nach einem Aufruf von Resume.
aber auch:
Zitat:

Classes.TThread.Start
......
Beginnt die Ausführung eines Threads.

Rufen Sie Start auf, um das Ausführen eines im unterbrochenen Status erzeugten Threads zu starten. Um ein Thread im unterbrochenen Status zu erzeugen, übergeben Sie true an den Konstruktor des Threads. Für die Threads, die im unterbrochenen Status nicht erzeugt wurden, hat Start keine Auswirkung.

Anmerkung: Die Methode Resume ist veraltet und seine Verwendung soll vermieden werden. Verwenden Sie stattdessen die Methode Start.
Gruß Klaus.

EWeiss 22. Aug 2011 20:22

AW: W1000 Symbol 'Resume' ist veraltet ????
 
Ich sehe Suspend ist veraltet...
aber was verwenden an stelle dessen?

Werde aus euren Beiträgen nicht so richtig schlau.

OK für Resume nehme ich Start..
aber für Suspend ?

EDIT:
Terminate?

gruss

Tryer 22. Aug 2011 20:39

AW: W1000 Symbol 'Resume' ist veraltet ????
 
Suspend sollte man ganz vermeiden, da man nie wissen kann in welchem Augenblick man den Thread damit erwischt - schwer zu findende Deadlocks sind so vorprogrammiert. Besser Terminate oder ein eigenes Flag(Boolean/Event/Semaphore..) verwenden um den Thread ggf. an einer kontrollierten Stelle warten zu lassen.

EWeiss 22. Aug 2011 21:01

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

Zitat von Tryer (Beitrag 1118715)
Suspend sollte man ganz vermeiden, da man nie wissen kann in welchem Augenblick man den Thread damit erwischt - schwer zu findende Deadlocks sind so vorprogrammiert. Besser Terminate oder ein eigenes Flag(Boolean/Event/Semaphore..) verwenden um den Thread ggf. an einer kontrollierten Stelle warten zu lassen.

Wenn ich so wie vorgeschlagen Suspend mit Terminate ersetze..
bzw. Resume mit Start dann geht bei mir gar nichts mehr.

Hmmmm ... Dann besser so belassen und mit den Warnungen leben?

gruss

Tryer 22. Aug 2011 22:01

AW: W1000 Symbol 'Resume' ist veraltet ????
 
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:
Delphi-Quellcode:
while FHalted and not Terminated do Sleep(10);


Grüsse, Dirk

EWeiss 22. Aug 2011 22:25

AW: W1000 Symbol 'Resume' ist veraltet ????
 
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

Tryer 22. Aug 2011 22:32

AW: W1000 Symbol 'Resume' ist veraltet ????
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:12 Uhr.
Seite 1 von 4  1 23     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