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 2 von 4     12 34      
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)
 
Benutzerbild von gsh
gsh

 
Delphi XE Architect
 
#11
  Alt 5. Mai 2008, 21:52
cool das kann ich in meinem aktuellen Projekt sicher gut gebrauchen ... Danke
Alex
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#12
  Alt 5. Mai 2008, 22:19
jupp, nettes Teil

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)
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#13
  Alt 6. Mai 2008, 11:26
Zitat von himitsu:
zum ASM: laut Intels Definition
Du meinst wohl laut "Microsofts Definition". Denn das OS gibt die Register-Reservierung vor und nicht der Prozessor.


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.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
jbg

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

 
Delphi 11 Alexandria
 
#15
  Alt 12. Mai 2008, 14:41
Markus Kinzler
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#16
  Alt 14. Mai 2008, 17:38
Da war doch glatt noch ein Bug in der AsyncMultiSync() Funktion enthalten. Es gibt nun die Version 2.21.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx
 
#17
  Alt 25. Mai 2008, 04:22
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.
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#18
  Alt 25. Mai 2008, 08:04
Vielleicht ist es die Delphi Threading Library ( DPL) bis dahin ja fertig
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#19
  Alt 25. Mai 2008, 08:20
ja also, dann will ich och ma was sagen ... nett

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



PS: Delphi Threading Library ( DPL ) ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

 
Delphi 11 Alexandria
 
#20
  Alt 25. Mai 2008, 08:32
[OT] Vielleicht meint er Delphi Phishing Library [/OT]
Detlef
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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