![]() |
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. ![]() |
Re: AsyncCalls 2.01 - Inlined VCL/Main Thread Synchronisieru
cool das kann ich in meinem aktuellen Projekt sicher gut gebrauchen ... Danke :thumb:
|
Re: AsyncCalls 2.01 - Inlined VCL/Main Thread Synchronisieru
jupp, nettes Teil :shock:
zum ASM: laut Microsofts/Intels Definition dürfen ESP EBP EDI ESI EBX nicht verändert werden, bzw. müssen wiederhergestellt werden (also nicht nur Delphi vereinnahmt das EBX) |
Re: AsyncCalls 2.01 - Inlined VCL/Main Thread Synchronisieru
Zitat:
Ich werde heute Abend übrigens die Version 2.1 herausbringen, die noch weniger Einschränkungen bzgl. der im MainThread-Block verwendeten Anweisungen hat (man sollte im Moment kein "Exit;" einbauen) und bei der auch das Exception-Handling für Delphi 6, 7, und 2005 funktioniert. |
Re: AsyncCalls 2.2 - Inlined VCL/Main Thread Synchronisierun
Ich habe soeben die Version 2.2 herausgegeben. Dieser behebt alle mir bekannten Bugs und unterstützt auch wieder Delphi 5 und 6.
Download siehe erste Seite (erster Eintrag) |
Re: AsyncCalls 2.2 - Inlined VCL/Main Thread Synchronisierun
:thumb:
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Da war doch glatt noch ein Bug in der AsyncMultiSync() Funktion enthalten. Es gibt nun die Version 2.21.
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
eine richtig schicke Idee!
2 Fragen ... 1.Frage .. Was vermutest Du, wieviel Änderungen vorraussichtlich notwendig werden, wennn GodeGear mal auf 64 Bit umstellen sollte? Oder könnte es auch so einfach weiterhin funktionieren. Wahrscheinlich nicht, oder? 2. Frage .. hast Du es ausgiebieg mit 3 oder 4 Thread getestet, dass sich da auch nix verhakt? falls EnterMainThread schon aufgerufen wurde, und nun von einem weiteren Thread nochmal aufgerufen werden soll? vielen Dank nochmal! So kann man sehr flexibel ab und an mal was sichtbares anzeigen. Und muss nicht ständig alle ThreadEvents mit Synchronize aufrufen. |
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Vielleicht ist es die Delphi Threading Library ( DPL) bis dahin ja fertig
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
ja also, dann will ich och ma was sagen ... nett :thumb:
ok, hab zwarauch schon dieses ganze Synchronize- und zeugs Mithilfe 'nem kleinen Locked-Byte umgangen, aber hiermit könnte man Einiges hübscher lösen :-D PS: Delphi Threading Library ( DPL ) ? |
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
[OT] Vielleicht meint er Delphi Phishing Library :lol: [/OT]
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
![]() [OT]aber die Phishing-Library ist kein schlechter name. Damit hätte Delphi einen Zielmarkt den mitsicherheit kein normaler IDE/Frameworkhersteller bedienen will :mrgreen: [/OT] |
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Ein paar Blogeinträge zur DPL (Delphi Parallel Library)
![]() ![]() ![]() ![]() ![]() |
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
ok, dann wäre das auch geklärt ... mir waren ja nur die Buchstaben T<>P irgendwie nicht zusammenpassend genug :mrgreen:
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Zitat:
Zitat:
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
War auch nicht als 1:1 Abkürzung gedacht.
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
So hab das jetzt in meinem projekt eingebaut und ich muss sagen :thumb:
Bin sehr zufrieden damit Danke jbg |
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Sehr nette Sache! Eine Frage habe ich aber: Ist es möglich, Threads (oder die darin ausgeführten Prozeduren) "mit Gewalt" abzubrechen? Kann ja sein dass das Programm "unterwegs" feststellt, dass die asynchrone Berechnung nicht mehr gebraucht wird, weil sich irgendwas geändert hat und sie eh neu angeworfen werden muss. Dann würde ich gerne den Thread abwürgen und nochmal neu beginnen, ohne das überflüssige Resultat abwarten zu müssen. Könnte allerdings ressourcenfreigabetechnisch stressig werden...
Ich würde jetzt ab und an eine Flagabfrage z.B. in die Ausführungsschleife einbauen. Eleganter wäre es aber, wenn das der "Auftraggeber" der asynchronen Ausführung regeln könnte. |
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Funktioniert das ganze auch in mittels CreateThread oder BeginThread erzeugten Threads? Weil du geschrieben hattest, dass letztendlich doch nur die Synchronize Funktion des TThread Objektes aufgerufen wird.
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Zitat:
Zitat:
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Zitat:
|
Re: AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisieru
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 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