hier hakt es bei mir, wofür brauche ich hier dann lokale (innerhalb des Threads gültige) CriticalSections.
Jupp, tut mir leid. Hatte das Originalthema nicht komplett gelesen und auch jetzt nur überflogen. Aber der Code bei dem jeder Thread seine eigene CS hat, ist natürlich Unsinn. Ein Synchronisationsobjekt funktioniert nur wenn alle das gleiche benutzen.
Hmmm, das sehe ich anders, wenn ich optimal laufenden Code erzeugen will mit der maximal möglichen Performance. Natürlich wird es auch mit einer externen CS funktionieren, aber eben nicht so performant wie es laufen könnte.
Beispiel:
Delphi-Quellcode:
GlobalCS : TCriticalSection;
TMyThread = class( TThread )
{...}
Info : Int64;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
GlobalCS.Enter;
try
QueryPerformanceCounter( Info );
finally
GlobalCS.Leave;
end;
end;
end;
MyThread1, MyThread2 : TMyThread;
procedure ImMainThread;
var
ThInfo : Int64;
begin
GlobalCS.Enter;
// Beide Threads MyThread1, MyThread2 stoppen jetzt, weil sie ja
// GlobalCS nicht mehr betreten können.
// Ich will aber nur von MyThread1 etwas wissen, warum soll MyThread2 dann gestört werden???
try
ThInfo := MyThread1.Info;
finally
GlobalCS.Leave;
end;
end;
Meine Variante sieht so aus
Delphi-Quellcode:
TMyThread = class( TThread )
ThreadCS : TCriticalSection;
FInfo : int64;
{...}
property Info : Int64 read GetInfo;
end;
function GetInfo : Int64;
begin
ThreadCS.Enter;
try
Result := FInfo;
finally
ThreadCS.Leave;
end;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
ThreadCS.Enter;
try
QueryPerformanceCounter( FInfo );
finally
ThreadCS.Leave;
end;
end;
end;
MyThread1, MyThread2 : TMyThread;
procedure ImMainThread;
var
ThInfo : Int64;
begin
ThInfo := MyThread1.Info;
end;
Der Zugriff auf die Property ist wesentlich leichter und es wird nur der Thread gestört, den ich abfrage.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)