Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisierung (https://www.delphipraxis.net/113200-asynccalls-2-21-inlined-vcl-main-thread-synchronisierung.html)

jbg 4. Mai 2008 14:13


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:
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

mkinzler 4. Mai 2008 14:19

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

jbg 4. Mai 2008 14:27

Re: Inlined VCL/Main Thread Synchronisierung
 
Zitat:

Zitat von mkinzler
Du machst einem ja Angst :zwinker: in welchem Tempo du Fehler/Beschränkungen von Delphi aus dem Weg räumst

Naja, der Code für "inlined VCL/main thread synchronization" lag schon lange herum. Nur hatte ich noch Probleme mit dem Exception-Handling, die ich aber nun beheben konnte.

Bernhard Geyer 4. Mai 2008 17:49

Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
 
Zitat:

Delphi 5 and 6 aren't supported anymore
:-( Im moment haben wir noch D6 im einsatz (hoffen in den nächsten monaten nach D2007 welcheln zu können). Kannst du mir einen Tipp geben ob ich es doch noch für D6 zum laufen bringen könnte?

Ansonsten :thumb:

jbg 4. Mai 2008 18:06

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.

jbg 4. Mai 2008 18:35

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.

mkinzler 4. Mai 2008 18:37

Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
 
Das ist ein Service :thumb:

jbg 4. Mai 2008 18:43

Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
 
Zitat:

Zitat von mkinzler
Das ist ein Service :thumb:

Nein. Mir ist heute nur langweilig.

Bernhard Geyer 4. Mai 2008 19:44

Re: AsyncCalls 2.0 - Inlined VCL/Main Thread Synchronisierun
 
Zitat:

Zitat von jbg
Ich habe mir jetzt doch die Mühe gemacht und die fehlende Delphi 6 Funktionalität weitgehends nach implementiert.

Many Thanks :thumb:

jbg 5. Mai 2008 21:43

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.

Homepage, Beschreibung, Download


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr.
Seite 1 von 4  1 23     Letzte »    

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