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
Seite 4 von 4   « Erste     234   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#31

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

  Alt 24. Aug 2011, 09:58
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 20:42 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