Delphi-PRAXiS
Seite 2 von 2     12   

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)

Edelfix 30. Okt 2019 11:16

AW: Threads und UI aktualisieren
 
Interessantes Thema.

Habe ein bisschen ausprobiert:

Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
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
            MainForm.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);
    lblStatus.Repaint; // lblRunning wird aktualisiert
    lblRunning.Repaint; // bringt nix
    //self.Update; // nur lblRunning wird aktualisiert
    //Application.ProcessMessages; // beide werden aktualisiert
    Inc(i);
  end;
end;

p80286 30. Okt 2019 11:19

AW: Threads und UI aktualisieren
 
Zitat:

Zitat von TigerLilly (Beitrag 1450500)
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.

Wenn ich waitforAll richtig verstanden habe, geht es erst weiter wenn alle Tasks abgearbeitet sind.

Gruß
K-H

Mavarik 30. Okt 2019 12:00

AW: Threads und UI aktualisieren
 
Zitat:

Zitat von TigerLilly (Beitrag 1450433)
Was übersehe ich?

Wenn Du willst, dass Deine UI upgedated wird, musst Du die Procedure, die den Thread gestartet hat verlassen.

Du kannst nicht einen Thread erzeugen und dann "modal" warten... Du musst immer erst die Kontrolle an den UI-Tread/ Main-MessageQueue zurück geben.

Nur wenn die Main-Messagequeue läuft, kann sich die UI aktualisieren. Also überhaupt auf Queue oder Synchronize reagieren. "Früher" hat man zur "NOT" Application.Processmessages aufgerufen. Aber wie wir alle wissen,sollte man das nur im "NOTFALL" machen, weil es in der Regel nur zu Problemen führt.

Beispiel : Ein scheinmodales Fenster ruft in einer Schleife Application.Processmessages auf, daher können andere Programmteile aufgerufen werden, die dann in dieser Schleife laufen... Probleme sind vorprogrammiert.

Mavarik

PS.: Abgesehen davon: Unter VCL geht Dein Aufruf vielleicht - Unter FMX wird die Button Click Animation schon nicht mehr gezeigt (je nach Style). Du solltest auch den Button auf enabled := false setzen. (So wie in meinen Beispiel aus dem anderen Thread)

Rollo62 30. Okt 2019 12:15

AW: Threads und UI aktualisieren
 
Zitat:

Zitat von p80286 (Beitrag 1450510)
Zitat:

Zitat von TigerLilly (Beitrag 1450500)
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.

Wenn ich waitforAll richtig verstanden habe, geht es erst weiter wenn alle Tasks abgearbeitet sind.

Gruß
K-H

Richtig, aber das WaitForAll wird ja alle Sekunde mal abgebrochen.
WaitForAll(aTasks, 1000)

Wie Mavarik schon sagt: scheinmodal :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.
Seite 2 von 2     12   

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