![]() |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Er wirft c ja nicht weg, er hat es eigentlich nur nie gehabt. Er benutzt es nur in den Registern.
|
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Schalte mal die Stackframes für die Funktion an. Einfach vor die Methode ein {$STACKFRAMES ON} und danach ein {$STACKFRAMES OFF}.
|
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Mit Stackframes bekomme ich nun in dem weiter unten gelegenen Codeabschnitt beim Zugriff auf den Hauptthread eine Schutzverletzung:
Delphi-Quellcode:
Nachtrag:
if c>0 then begin
EnterMainThread; try log(inttostr(c)+' Automat(en) von Mandant '+clientData.cname+' gelöscht, Laufzeit '+inttostr(et-st)+' ms ',1); dispatcherForm.deletedMachinesLED.Status:=false; // <---- Schutzverletzung tritt hier auf dispatcherform.lDeletedMachineLED.Caption:='Suche nach gelöschten Automaten (letzte Laufzeit: '+inttostr(et-st)+' ms )'; finally LeaveMainThread; end; end; Die Schutzverletzung tritt in Unit System auf, in Methode TObject.InheritsFrom |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Zwar konnte ich meinen Fehler aus dem letzten Post nicht mehr wirklich ausfindig machen aber ich habe inzwischen noch etwas gefunden, das mich stutzig macht. Meine Anwendung, die zwei oder mehr asynchrone Aufrufe derselben Prozedur gleichzeitig laufen lässt, hängt sich auf, sobald in der Prozedur ein exit aufgerufen wird. Das passiert übrigens nicht sofort, sondern vielmehr nach 50-100 Aufrufen.
In der Unit asynccalls, wie auch hier, konnte ich nur von Problemen mit Exit innerhalb eines EnterMainThread-LeaveMainThread - Blocks lesen, das aber auch gelöst zu sein scheint. Um nicht wieder als doof abgestempelt zu werden: Was ist mein Fehler? Ich würde mich wirklich freuen, wenn mir das jemand erklären würde. |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Da ich deinen Code nicht kenne, kann ich nur Rätseln woran das liegen kann. Das kann von Speicherüberschreibungen deines Codes bis zu glattem Fehlverhalten meines Codes reichen.
Zitat:
Ansonsten würde ich dir zu den TAsyncCalls.Invoke() bzw. TAsyncCalls.VCLSync() / TAsyncCalls.VCLInvoke() Methoden raten, denn die basieren nicht auf Annahmen über den kompilierten Code. Wahrscheinlich generiert der Compiler bei dir einen Code der von den alten AsyncCalls Methoden nicht behandelt wird/werden kann.
Delphi-Quellcode:
Wir mit den neuen Methoden zu:
EnterMainThread;
try bla; finally LeaveMainThread; end;
Delphi-Quellcode:
TAsyncCalls.VCLSync(procedure
begin bla; end); |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Das Ganze lässt sich in wenigen Zeilen reproduzieren. Ich lade morgen mal ein kleines Testprojekt hoch, sobald ich auf Arbeit bin.
Beste Grüße, David |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Hallo,
ich möchte dem Autor für diese Arbeit ein großes Lob aussprechen. Wirklich ein sehr nützliches und gut funktionierendes Tool. Dafür vielen Dank! Gruß Michael |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Warum hört die VCL auf, auf Eingaben zu reagieren, wenn ich Invoke oder AsynCall aufrufe? Ich dachte, das geht alles über Threads? Die Funktion springt ja auch sofort zurück, aber eine Form reagiert nicht mehr.
Was man immer machen muss ist:
Delphi-Quellcode:
Aber muss das wirklich so sein?
while AsyncMultiSync([x], True, 10) = WAIT_TIMEOUT do
Application.ProcessMessages; |
Re: AsyncCalls 2.91 - Asynchrone Funktionsaufrufe in Delphi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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