Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Threads und UI aktualisieren (https://www.delphipraxis.net/202390-threads-und-ui-aktualisieren.html)

TigerLilly 29. Okt 2019 14:39

Threads und UI aktualisieren
 
Ja, das sind alles ähnliche Fragen, sorry, aber trotzdem danke für eine Antwort:

Die Intention:
1) Eine Aufgabe, die lange dauert, wird im Hintergund ausgeführt und aktualisiert das UI. Das funktioniert gut.
2) Das UI wartet bis die Aufgabe fertig ist und siganlisiert seineseits, dass da noch was arbeitet. Hier hab ich das Problem. Sobald ich TTAsk.WaitForAll aufrufe, wird nichts mehr aktualisiert.

Code:
var
  aTasks: array of ITask;
  i:     Integer;
begin
  SetLength(aTasks, 1);
  aTasks[0] := TTask.Create(procedure()
    var
      i: Integer;
    begin
      for i := 0 to 100 do begin
        Sleep(100);
        TThread.Synchronize(nil, procedure()
          begin
            lblStatus.text := IntToStr(i);
          end);
      end
    end);
  aTasks[0].Start;
  i := 1;
  while not TTask.WaitForAll(aTasks, 1000) do begin
    lblRunning.text := 'Running ' + IntToStr(i);
    Inc(i);
  end;
end;
Was übersehe ich?

Klaus01 30. Okt 2019 07:11

AW: Threads und UI aktualisieren
 
Guten Morgen,

vielleicht hilft der SO Artikel: https://stackoverflow.com/questions/...vs-synchronise

Grüße
Klaus

TigerLilly 30. Okt 2019 07:24

AW: Threads und UI aktualisieren
 
Den Artikel kenne ich , danke. Der Punkt ist, ich verstehe nicht. Warum blockiert das Warten auf das Taskende mit TTask.WaitForAll die Ausgabe via Synchronize?

Rollo62 30. Okt 2019 07:30

AW: Threads und UI aktualisieren
 
Geht es denn mit Queue ?

TigerLilly 30. Okt 2019 08:09

AW: Threads und UI aktualisieren
 
Ich will 2 Dinge verstehen:

1) Feedback im UI WÄHREND der Task läuft: Task sagt: Ich laufe noch"
2) Feedbackim UI BIS der Task zu Ende ist. UI sagt: "Task läuft noch".

1) geht gut mit Synchronize, Messages, Events, Queues.
2) ?

Rollo62 30. Okt 2019 09:14

AW: Threads und UI aktualisieren
 
Du hast 2 verschiedene Labels Status und Running,
verstehe ich 1.) und 2.) richtig das lblStatus funktioniert, und nur lblRunning nicht ?

TigerLilly 30. Okt 2019 09:35

AW: Threads und UI aktualisieren
 
Ich habe 2 Lables, das stimmt.

Ich kann aus dem Task heraus beide aktualisieren (bzw natürlich das ganze UI).

Ich kann nicht aus dem UI den Status des Tasks anzeigen. Dafür hätte ich gerne Ideen. (Timer zB und den TaskStatus abfragen?)

p80286 30. Okt 2019 09:54

AW: Threads und UI aktualisieren
 
Zitat:

Zitat von TigerLilly (Beitrag 1450487)
Ich kann aus dem Task heraus beide aktualisieren (bzw natürlich das ganze UI).

Nein! Die Gui macht das selbst - mit den daten die sie erhält.

Gruß
K.H

TigerLilly 30. Okt 2019 10:49

AW: Threads und UI aktualisieren
 
Naja, je nach Methode stimmt das mehr oder weniger.

Aber ich würde gern verstehen, warum im Codestück unten so gar nichts aktualisiert wird.

Rollo62 30. Okt 2019 10:52

AW: Threads und UI aktualisieren
 
Evtl. liegt es daran das ein Label.Repaint; fehlt, sowas kenne ich allerdings eher von CrossPlattform.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 1 von 2  1 2      

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