AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TTask.WaitForAll hängt

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

Registriert seit: 6. Mai 2011
401 Beiträge
 
#1

TTask.WaitForAll hängt

  Alt 2. Jun 2021, 12:20
Ich steig nicht ganz durch wie waitforAll/waitforAny funktioniert.
Ich habe nach http://docwiki.embarcadero.com/RADSt...amming_Library
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:
TThread.Synchronize(NIL,
Procedure
begin
end
Was übersehe ich hier? Was gibt dem WaitForAll die Info das es durch ist? Kein exit oder end in der procedure?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.665 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TTask.WaitForAll hängt

  Alt 2. Jun 2021, 12:39
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
401 Beiträge
 
#3

AW: TTask.WaitForAll hängt

  Alt 2. Jun 2021, 13:22
Ok verstehe.
Muss ich mir was anderes ausdenken.
  Mit Zitat antworten Zitat
softtouch

Registriert seit: 13. Feb 2015
27 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TTask.WaitForAll hängt

  Alt 2. Jun 2021, 21: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
38.603 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TTask.WaitForAll hängt

  Alt 3. Jun 2021, 09: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.
Delphi-Tage 2005-2014

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

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

AW: TTask.WaitForAll hängt

  Alt 3. Jun 2021, 14: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
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.665 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TTask.WaitForAll hängt

  Alt 3. Jun 2021, 14: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
401 Beiträge
 
#8

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 09: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
8.665 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 09: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
401 Beiträge
 
#10

AW: TTask.WaitForAll hängt

  Alt 4. Jun 2021, 10: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
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 04:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf