Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS Grafische Ausgabe aus einem Thread heraus (https://www.delphipraxis.net/200770-grafische-ausgabe-aus-einem-thread-heraus.html)

amigage 23. Mai 2019 15:08

Grafische Ausgabe aus einem Thread heraus
 
Hallo,

ich weiß, dass man in Threads nicht auf die GUI zugreifen darf und dies nur im Synchronize() Abschnitt bewerkstelligen soll.
Wie bekomme ich es aber hin, dass Ausgaben während des Thread Ablaufs möglich sind?

Der nachfolgende Code ist jetzt ein simples Beispiel.
In meinem Fall dauert der Thread ca. 5 Sekunden. In der Zeit soll ausgegeben werden, an welcher Stelle der Abarbeitung die App sich gerade befindet.

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure ()
  begin

    for var i: integer := 0 to 1000 do
    begin
      lblOutput.Text := i.ToString; // problematische Ausgabe
    end;

    TThread.Synchronize (TThread.CurrentThread,
      procedure ()
      begin
        lblOutput.Text := 'Finished';
      end);
  end).Start;
end;
Danke.

Klaus01 23. Mai 2019 15:09

AW: Grafische Ausgabe aus einem Thread heraus
 
.. geht auf iOS sendMessage, postMessage oder events?

Grüße
Klaus

TiGü 23. Mai 2019 15:53

AW: Grafische Ausgabe aus einem Thread heraus
 
Genauso wie skizziert mit Synchronize.
Man muss ja nicht jeden Quatsch synchronisieren und nur jede zweite bis zehnte Änderung der GUI mitteilen.

amigage 24. Mai 2019 09:43

AW: Grafische Ausgabe aus einem Thread heraus
 
Ich habe es nun selbst herausgefunden. TThread.Queue() ist die Lösung :thumb:

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure ()
  begin

    for var i: integer := 0 to 1000 do
    begin
      TThread.Queue(nil, procedure
      begin
        lblOutput.Text := i.ToString; // problematische Ausgabe
      end);
    end;

    TThread.Synchronize(TThread.CurrentThread, procedure ()
    begin
      lblOutput.Text := 'Finished';
    end);
  end).Start;
end;

Mavarik 24. Mai 2019 13:10

AW: Grafische Ausgabe aus einem Thread heraus
 
Zitat:

Zitat von amigage (Beitrag 1433028)
Ich habe es nun selbst herausgefunden. TThread.Queue() ist die Lösung :thumb:

Zitat:

Zitat von TiGü (Beitrag 1432977)
Man muss ja nicht jeden Quatsch synchronisieren und nur jede zweite bis zehnte Änderung der GUI mitteilen.

Oder nur 25x pro sekunde...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 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