Wer kennt das nicht. Wenn man mit Threads arbeitet und auf die
VCL zugreifen möchte, muss man eine Hilf-Methode schreiben, die dann per Synchronize() aufgerufen wird. Dabei müssen die ganzen Parameter in Felder des Thread-Objekts geschrieben werden, damit sie in der synchronisierten Methoden zur Verfügung stehen.
Dies führt dazu, dass man den Programmfluss nicht ganz so einfach folgen.
Mit AsyncCalls kann man das ganze Problem anders angehen, da dort "inlined
VCL synchronization" implementiert ist.
Delphi-Quellcode:
procedure TMyThread.Execute;
var
S: string;
I: Integer;
begin
for I := 0 to 100 do
begin
// ...
{ ProgressBar aktualisieren }
S := IntToStr(I) + '%';
EnterMainThread;
try
Label1.Caption := S;
ProgressBar1.Position := I;
finally
LeaveMainThread;
end;
end;
end;
AsyncCalls ermöglicht aber noch mehr. So kann man eine Funktion in einem anderen Thread ablaufen lassen.
Delphi-Quellcode:
procedure MyProc(S: string);
procedure WorkerThread;
var
I: Integer;
begin
// Thread beschäftigen
for I := 0 to 1000000 do
S := S + ' '; // Zugriff auf S aus der umgebenden Funktion
end;
var
a: IAsyncCall;
begin
a := LocalAsyncCall(@WorkerThread);
DoSomethingTimeConsuming;
a.Sync; // ab hier muss S fertig "berechnet" sein
DoSomething(S);
end;
Homepage, Beschreibung, Download