Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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)

sirius 24. Aug 2011 08:58

AW: W1000 Symbol 'Resume' ist veraltet ????
 
Ich weis grad nicht, wie speziell ich darauf antworten soll.
Für Threads gibt es keine 0815 Lösung. Es gibt ein paar Möglichkeiten, wie man so etwas gestalten kann (z.B. WorkerThread oder ThreadPool, ...) aber du musst es immer speziell an deine Aufgabe anpassen.

Die Verwendung einer Critical Section geht am besten über eine Klasse:
Delphi-Quellcode:
//Beispiel aus der aktuellen Version (2.03) von TDosCommand

TSyncString=class(TSimpleRWSync)
//TSimpleRWSnyc benutzt intern TCriticalSection
  private
    FValue:String;
    procedure setValue(Value:String);
    function getValue:String;
  public
    function length:Integer;
    property Value:String read getValue write SetValue;
    procedure Add(Value:String);
    procedure Delete(Pos,Count:Integer);
  end;



{ TSyncString }

procedure TSyncString.Add(Value: String);
begin
  BeginWrite; // =EnterCriticalSection
  try
    FValue:=FValue+Value;
  finally
    EndWrite; //=LeaveCriticalSection
  end;
end;

procedure TSyncString.Delete(Pos, Count: Integer);
begin
  BeginWrite; // =EnterCriticalSection
  try
    system.Delete(FValue,Pos,Count);
  finally
    EndWrite; //=LeaveCriticalSection
  end;
end;

function TSyncString.getValue: String;
begin
  BeginRead; // =EnterCriticalSection
  try
    result:=FValue;
  finally
    EndRead; //=LeaveCriticalSection
  end;
end;

function TSyncString.length: Integer;
begin
  BeginRead; // =EnterCriticalSection
  try
    result:=system.length(FValue);
  finally
    EndRead; //=LeaveCriticalSection
  end;
end;

procedure TSyncString.setValue(Value: String);
begin
  BeginWrite; // =EnterCriticalSection
  try
    FValue:=Value;
  finally
    EndWrite; //=LeaveCriticalSection
  end;
end;
Da hier in jeder Methode das gleiche (von der Elternklasse benutzte) Critical-Section-Objekt benutzt wird, kann nur ein einziger Thread in einer der Methoden (zwischen BeginXXX und EndXXX) sein. Wenn gleichzeitig ein anderer Thread auf den String zugreifen will muss er bei BeginXXX warten bis der andere Thread fertig ist.

Diese Klasse kann jetzt in jedem Thread benutzt werden und es gibt keine Synchronisationsprobleme. so benutzt man CriticalSections am besten.
Aber neben CriticalSections gibt es noch eine ganze Reihe anderer Synchronisationsmöglichkeiten (darüber könnte man ein Buch schreiben, was es womöglich auch schon gibt). Die alle aufzulisten und zu erklären würde den Rahmen hier sprengen.
Was du für deine booleanVariable noch wissen solltest sind aber die interlocked-Funktionen. Da hat Windows (eigentlich die Intel-Architektur) eine nette Sache, das für das Ändern eines 32bit Wertes kann man (allerdings an jeder Stelle, wo man den Wert schreibend ändert) interlockedAdd, interlockedExchange,... verwenden. Suche einfach mal nach den Funktionen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.
Seite 4 von 4   « Erste     234   

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