AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisierung
Thema durchsuchen
Ansicht
Themen-Optionen

AsyncCalls 2.21 - Inlined VCL/Main Thread Synchronisierung

Ein Thema von jbg · begonnen am 4. Mai 2008 · letzter Beitrag vom 21. Jun 2008
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
jbg
Registriert seit: 12. Jun 2002
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)
 
mkinzler

 
Delphi 11 Alexandria
 
#2
  Alt 4. Mai 2008, 14:19
Du machst einem ja Angst in welchem Tempo du Fehler/Beschränkungen von Delphi aus dem Weg räumst
Markus Kinzler
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#3
  Alt 4. Mai 2008, 14:27
Zitat von mkinzler:
Du machst einem ja Angst 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.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

 
Delphi 10.4 Sydney
 
#4
  Alt 4. Mai 2008, 17:49
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
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#5
  Alt 4. Mai 2008, 18:06
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.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#6
  Alt 4. Mai 2008, 18:35
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.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#7
  Alt 4. Mai 2008, 18:37
Das ist ein Service
Markus Kinzler
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#8
  Alt 4. Mai 2008, 18:43
Zitat von mkinzler:
Das ist ein Service
Nein. Mir ist heute nur langweilig.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

 
Delphi 10.4 Sydney
 
#9
  Alt 4. Mai 2008, 19:44
Zitat von jbg:
Ich habe mir jetzt doch die Mühe gemacht und die fehlende Delphi 6 Funktionalität weitgehends nach implementiert.
Many Thanks
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#10
  Alt 5. Mai 2008, 21:43
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
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz