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
Seite 1 von 2  1 2      
stalkingwolf

Registriert seit: 6. Mai 2011
540 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
11.453 Beiträge
 
Delphi 12 Athens
 
#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
540 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
Benutzerbild von softtouch
softtouch

Registriert seit: 13. Feb 2015
Ort: Kerpen
235 Beiträge
 
Delphi 12 Athens
 
#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
44.071 Beiträge
 
Delphi 12 Athens
 
#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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

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

Registriert seit: 15. Sep 2008
Ort: Dubai
681 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
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.453 Beiträge
 
Delphi 12 Athens
 
#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
540 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
11.453 Beiträge
 
Delphi 12 Athens
 
#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
540 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      


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 12:00 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