![]() |
AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisierung
Liste der Anhänge anzeigen (Anzahl: 1)
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:
AsyncCalls ermöglicht aber noch mehr. So kann man eine Funktion in einem anderen Thread ablaufen lassen.
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;
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; ![]() |
Re: Inlined VCL/Main Thread Synchronisierung
Du machst einem ja Angst :zwinker: in welchem Tempo du Fehler/Beschränkungen von Delphi aus dem Weg räumst
|
Re: Inlined VCL/Main Thread Synchronisierung
Zitat:
|
Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
Zitat:
Ansonsten :thumb: |
Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
Du müsstest dafür einen Ersatz für TThread.StaticSynchronize finden und dann mit Hilfe des "WakeMainThread: TNotifyEvent" event handlers das "SyncEvent: TEvent" nachbauen.
Delphi 5 ist schon wegen seiner Thread-Architektur nicht zu gebrauchen. |
Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
Ich habe mir jetzt doch die Mühe gemacht und die fehlende Delphi 6 Funktionalität weitgehends nach implementiert. Aber Delphi 5 werde ich nicht mehr unterstützen können. Das Synchronize von Delphi 5 ist nun mal ganz anders aufgebaut.
|
Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
Das ist ein Service :thumb:
|
Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
Zitat:
|
Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
Zitat:
|
Re: AsyncCalls 2.01 - Inlined VCL/Main Thread Synchronisieru
Da war ich gestern einfach zu euphorisch nachdem ich das Exception-Handling Problem gelöst hatte und habe ganz übersehen, dass der Compiler das Self so gerne in das EBX Register legt. Dieses wird natürlich beim Thread-Switch durch einen anderen Wert ersetzt und Crash.
Die neue Version 2.01 rettet das EBX, EDI und ESI Register nun in den synchronisierten Code herüber. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz