Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisierung

  Alt 4. Mai 2008, 14:13
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
Angehängte Dateien
Dateityp: zip asynccalls_149.zip (29,8 KB, 58x aufgerufen)
  Mit Zitat antworten Zitat