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.