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 3 von 4     123 4      
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 Bernhard Geyer
Bernhard Geyer

 
Delphi 10.4 Sydney
 
#21
  Alt 25. Mai 2008, 08:45
Delphi Parallel Library

[OT]aber die Phishing-Library ist kein schlechter name. Damit hätte Delphi einen Zielmarkt den mitsicherheit kein normaler IDE/Frameworkhersteller bedienen will [/OT]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#23
  Alt 25. Mai 2008, 09:08
ok, dann wäre das auch geklärt ... mir waren ja nur die Buchstaben T<>P irgendwie nicht zusammenpassend genug
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#24
  Alt 25. Mai 2008, 09:14
Zitat von stoxx:
1.Frage .. Was vermutest Du, wieviel Änderungen vorraussichtlich notwendig werden, wennn GodeGear mal auf 64 Bit umstellen sollte?
Der Assembler-Code müsste angepasst werden, da die Register dann 64 Bit breit sind. Das dürfte aber eine Arbeit von Minuten sein. Aber da es noch kein Delphi 64bit gibt, kann ich das ja schlecht schon programmieren.

Zitat:
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?
Das ganze ist schon abgesichert durch Critical Sections. Zudem wird intern bei EnterMainThread/LeaveMainThread auch nur mit Wasser gekocht und TThread.Synchronize aufgerufen.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#25
  Alt 25. Mai 2008, 09:14
War auch nicht als 1:1 Abkürzung gedacht.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

 
Delphi XE Architect
 
#26
  Alt 17. Jun 2008, 11:03
So hab das jetzt in meinem projekt eingebaut und ich muss sagen
Bin sehr zufrieden damit

Danke jbg
Alex
  Mit Zitat antworten Zitat
grefab
 
#27
  Alt 21. Jun 2008, 00:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

 
Delphi 10.2 Tokyo Starter
 
#28
  Alt 21. Jun 2008, 09:11
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.
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#29
  Alt 21. Jun 2008, 10:03
Zitat von grefab:
Könnte allerdings ressourcenfreigabetechnisch stressig werden...
Nicht nur das. Wenn du den Thread innerhalb einer CriticalSection abwürgst, bekommst du beim nächsten Start des Threads einen Deadlock.

Zitat:
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.
Und genau das sollte man nie machen. Man kann nur beim Thread anfragen, dass dieser sich beenden soll, denn nur er weiß wann es sicher ist, sich zu beenden.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#30
  Alt 21. Jun 2008, 10:03
Zitat von Zacherl:
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.
Wie meinst du das? TThread.StaticSynchronize ist eine Klassenmethode, die man auch außerhalb eines TThread Objekts ausrufen kann.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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