AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TTask.WaitForAll hängt

Ein Thema von stalkingwolf · begonnen am 2. Jun 2021 · letzter Beitrag vom 7. Jun 2021
Antwort Antwort
Benutzerbild von softtouch
softtouch

Registriert seit: 13. Feb 2015
Ort: Kerpen
218 Beiträge
 
Delphi 12 Athens
 
#1

AW: TTask.WaitForAll hängt

  Alt 2. Jun 2021, 20:59
Strate am Ende des Tasks einfach einen Timer, dessen code dann ausgeführt wird. So mache ich es auch immer. Nichts wird blockiert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.260 Beiträge
 
Delphi 12 Athens
 
#2

AW: TTask.WaitForAll hängt

  Alt 3. Jun 2021, 08:22
Timer?
Delphi-Referenz durchsuchenTThread.Queue


Oder im Hauptthread nicht nur stumpf warten, sondern dabei auch die Messages verarbeiten.
(siehe sowas wie Application.ProcressMessages oder Hier im Forum suchenDelay)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Jun 2021 um 08:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
632 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TTask.WaitForAll hängt

  Alt 3. Jun 2021, 13:25
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.089 Beiträge
 
Delphi 12 Athens
 
#4

AW: TTask.WaitForAll hängt

  Alt 3. Jun 2021, 13:35
Die simpelste Lösung wäre am Ende der Task-Methode ein TThread.Queue(nil, ...) aufzurufen.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
521 Beiträge
 
#5

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 08:26
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.
Was bei mir der Fall ist. Weil ich Daten von einem Server lade und es keinen Sinn ergibt vorher was anderes zu machen bis die Daten unten sind

Ich habe nun in meinem Task die UI disabled und dann kann der Anwender nicht irgendwo herumdrücken.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.089 Beiträge
 
Delphi 12 Athens
 
#6

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 08:54
Weil ich Daten von einem Server lade und es keinen Sinn ergibt vorher was anderes zu machen bis die Daten unten sind
Dann spar dir doch die Task ganz und führe die Abfrage im Hauptthread aus.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
521 Beiträge
 
#7

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 09:17
Weil ich Daten von einem Server lade und es keinen Sinn ergibt vorher was anderes zu machen bis die Daten unten sind
Dann spar dir doch die Task ganz und führe die Abfrage im Hauptthread aus.
Dann konnte ich meine UI nicht aktualisieren. Der Grund warum ich das überhaupt gemacht hatte.
Meine Fortschrittsanzeige hat nicht mehr funktioniert weil ab 10.3 das mit application.processmessage geändert wurde.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 10:37
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
240 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 10:47
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.
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:51 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