![]() |
TTask.WaitForAll hängt
Ich steig nicht ganz durch wie waitforAll/waitforAny funktioniert.
Ich habe nach ![]() meinen Task hinzugefügt. Wenn ich diesen mit tasks[0].start; anstarte dann funktioniert alles einwandfrei. Packe ich dann dahinter TTask.WaitForAll(tasks); dann kommt er nie wieder. Keine UI Aktualisierung und meine gesamte UI ist danach wie wie eingefroren. Pack ich ein TTask.WaitForAll(tasks,10000); rein, dann rennt mein Task nach den 10sek durch und ich erhalte die gesamte UI Aktualisierung wieder. Meine UI Aktualiserung mache ich mit
Code:
Was übersehe ich hier? Was gibt dem WaitForAll die Info das es durch ist? Kein exit oder end in der procedure?
TThread.Synchronize(NIL,
Procedure begin end |
AW: TTask.WaitForAll hängt
Das WaitForAll blockiert den Hauptthread und somit wird das Synchronize nicht abgearbeitet. Wenn du auf das Ende der Task warten musst, dann ist das ganze Konzept vielleicht nicht das richtige.
|
AW: TTask.WaitForAll hängt
Ok verstehe.
Muss ich mir was anderes ausdenken. |
AW: TTask.WaitForAll hängt
Strate am Ende des Tasks einfach einen Timer, dessen code dann ausgeführt wird. So mache ich es auch immer. Nichts wird blockiert.
|
AW: TTask.WaitForAll hängt
Timer?
![]() Oder im Hauptthread nicht nur stumpf warten, sondern dabei auch die Messages verarbeiten. (siehe sowas wie Application.ProcressMessages oder ![]() |
AW: TTask.WaitForAll hängt
Bei mir senden Threads eine Message oder ändern eine Variable wenn sie fertig sind oder was zu berichten haben.
WaitFor macht nur Sinn wenn man das Ergebnis unbedingt braucht bevor man weiter machen kann. Schicke jemanden essen hohlen -> warte auf das essen -> stille deinen Hunger. :roll: |
AW: TTask.WaitForAll hängt
Die simpelste Lösung wäre am Ende der Task-Methode ein
Delphi-Quellcode:
aufzurufen.
TThread.Queue(nil, ...)
Wenn aber der Code nach dem Task-Aufruf erst auf das Ende der Task warten muss, dann ist die Task vielleicht nicht das richtige Konzept. |
AW: TTask.WaitForAll hängt
Zitat:
Ich habe nun in meinem Task die UI disabled und dann kann der Anwender nicht irgendwo herumdrücken. |
AW: TTask.WaitForAll hängt
Zitat:
|
AW: TTask.WaitForAll hängt
Zitat:
Meine Fortschrittsanzeige hat nicht mehr funktioniert weil ab 10.3 das mit application.processmessage geändert wurde. |
AW: TTask.WaitForAll hängt
Bevor ich eine UI komplett lahmlege würde ich eher ein dynamisch generiertes Formular mit einer ProgressBar drauf Modal darstellen lassen. ("Downloading Data... please wait...")
TThread mit Syncronize sorgt für ein Update der UI. Auch ein Abbrechen button sollte nicht fehlen. Ich hoffe Du verstehst wie ich es meine. |
AW: TTask.WaitForAll hängt
Anstatt Synchronize verwende ich nun AtomicIncrement im Task um ein Flag zu setzen wenn Daten zur Anzeige fertig sind. Dieses Flag frage ich im Haupthread in einem Timer event periodisch ab und rufe, falls das Flag gesetzt ist, die Daten aus einem entsprechenden Objekt ab.
Mittels AtomicIncrement kann man auch einem Task mitteilen, dass er abbrechen soll. |
AW: TTask.WaitForAll hängt
Zitat:
Die Zugriffe habe ich mit TThread.Syncronize gelöst. Mit ging es nun nur um das waitForAll weil es mir die APP komplett still gelelgt hat. Aber ich habe es anders gelöst. Ein abbrechen vom Download macht eh keiner, weil die Daten benötigt werden. Dennoch Danke für das Feedback. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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