AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Label aktualisieren / TTask

Ein Thema von greenmile · begonnen am 12. Jan 2021 · letzter Beitrag vom 19. Jan 2021
Antwort Antwort
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Label aktualisieren / TTask

  Alt 13. Jan 2021, 10:05
Ich verzweifel noch. Ich benötige ein funktionierendes Delay, also um etwas bei Bedarf künstlich zu verzögern. Nehmen wir als Beispiel eine Testversion: Wenn es sich bei der App um eine Testversion handelt, dann soll 10 Sekunden gewartet werden (Delay 10), ansonsten direkt weitergemacht werden. Ich bekomme es einfach nicht hin. Es wird zwar gewartet, in der Wartezeit werden aber keine Nachrichten verarbeitet, ich kann also kein Warte-Progress anzeigen.

Unter Windows ganz einfach:

Code:
  Ende := GetTickCount+mSek;

  While (Ende>GetTickCount) do begin
    Sleep(5);
    Application.ProcessMessages;
  end;
Im Android funktioniert zwar die Wartezeit (klar, was soll auch passieren), es wird aber nichts verarbeitet, da Processmessages nicht funktioniert. Habe es auch schon mit einem Thread versucht in der Hoffnung, dass während 'WaitFor' Nachrichten wie Repaint verarbeitet werden ... Geht aber auch nicht. Obwohl ich Label.Repaint aufrufe, sehe ich die Änderungen auf dem Handy nicht. Beispiel:

Code:
Label1.Text := 'Hallo';
Delay(1000);
Label1.Text := 'Welt';
Delay(1000);
Label1.Text := 'Bin';
Delay(1000);
Label1.Text := 'Fertig';
Ist ein nonsens Code. Im Ergebnis ist entweder nichts sichtbar. Oder nur 'Fertig', selbst wenn ich im Delay "Label1.Repaint" aufrufe. Mache ich das unter Windows, dann steht dort im Sekundentakt 'Hallo' / 'Welt' / 'Bin' / 'Fertig'. Selbst mit einem Timer kann ich es nicht lösen, weil ich ja auch auf seine Beendigung warten muss.

Bin ich wirklich der einzige, der sowas braucht?

Geändert von greenmile (13. Jan 2021 um 10:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#2

AW: Label aktualisieren / TTask

  Alt 13. Jan 2021, 12:36
Ich hab so ein ähnliches Problem mit einem Timer gelöst. Der Timer feuert jede Sekunde, dann kanst du eine Bedingung testen und dann zB eine Bedingung umschalten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.556 Beiträge
 
Delphi 12 Athens
 
#3

AW: Label aktualisieren / TTask

  Alt 13. Jan 2021, 15:06
Wenn das System grundsätzlich nicht mit "derartigen" Messages arbeitet, dann bringt es auch nicht viel die Messages verarbeiten zu wollen, welche es nicht gibt.

Hier mal der Pfad für Android: Thread.Synchronize und Application.OnIdle
Delphi-Quellcode:
procedure TApplication.ProcessMessages; // das aus FMX.Forms.pas
var
  AppService: IFMXApplicationService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationService, AppService) then
    while AppService.HandleMessage do { loop };
end;

function TPlatformAndroid.HandleMessage: Boolean;
begin
  InternalProcessMessages;
  Result := False;
end;

procedure TPlatformAndroid.InternalProcessMessages;
begin
  CheckSynchronize;
  ProcessOnIdleEvent;
end;
Ich weiß nicht wie Android seine "Events" verwaltet und ob es in Delphi, bzw. im ADK eine API gibt, womit man anstehende Events jetzt verarbeiten kann ... wenn ja, dann sollte Emba Dieses aber besser mal ins ProcessMessages/HandleMessage einfügen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Jan 2021 um 15:16 Uhr)
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Label aktualisieren / TTask

  Alt 13. Jan 2021, 15:11
Wenn das System grundsätzlich nicht mit "derartigen" Messages arbeitet, dann bringt es auch nicht viel die Messages verarbeiten zu wollen, welche es nicht gibt.

Hier mal der Pfad für Android: Thread.Synchronize und Application.OnIdle
Delphi-Quellcode:
procedure TApplication.ProcessMessages; // das aus FMX.Forms.pas
var
  AppService: IFMXApplicationService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationService, AppService) then
    while AppService.HandleMessage do { loop };
end;

function TPlatformAndroid.HandleMessage: Boolean;
begin
  InternalProcessMessages;
  Result := False;
end;

procedure TPlatformAndroid.InternalProcessMessages;
begin
  CheckSynchronize;
  ProcessOnIdleEvent;
end;
Heißt auf Deutsch, bringt nix? Wann werden denn die zB Labels gezeichnet? Wenn ich es mit Repaint aufrufe, wird nix neu gezeichnet. Und wenn es keine Nachrichten gibt die verarbeitet werden, wie aktualisiere ich dann von Hand, ohne drauf zu warten, dass es der MainThread irgendwie erledigt?
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#5

AW: Label aktualisieren / TTask

  Alt 13. Jan 2021, 20:34
@greenmile: Ich glaube, du musst umdenken. Sowas wie "warten" funktioniert nicht. Du kannst "nachschauen", ob dein Thread schon fertig ist. Dein "Nag-Screen" wäre vielleicht so zu implementieren:


- MainForm anzeigen
- Thread starten + am Mainform ein Panel mit Infos anzeigen
- gleichzeitig einen Timer starten, der jede Sekunde nachschaut, ob der Thread schon fertig ist
- wenn ja, das Panel verstecken und den mainform "freigeben" und den Timer beenden

Hat für mich das Problem "Form schließen wenn Task noch läuft" gut gelöst. Aber ich bin offen für Fortbildung.
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Label aktualisieren / TTask

  Alt 14. Jan 2021, 10:36
Die Logik habe ich inzwischen (zähneknirschend) verstanden. Nur ... Wenn ich zwischen zwei Funktionen den Text von einen Label ändere, dann sehe ich die Aktualisierung nicht. Es muss doch irgendwie möglich sein, den Label zu aktualisieren. Also, versteh mich nicht falsch und ich bin wirklich dankbar für jede Hilfe. Aber irgendwie muss FMX die ja auch aktualisieren. Oder muss ich mich wirklich blind drauf verlassen, dass FMX die Änderung in eine Art Cache schreibt und Android entscheidet, wann der Bildschirm neu gezeichnet wird?
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#7

AW: Label aktualisieren / TTask

  Alt 14. Jan 2021, 12:41
Schau mal, da ist ein Beispiel:
Code:
  fTask := TTask.Run(procedure()
    var
      i:integer;
    begin
      for i:=1 to 1000 do begin
        if TTask.CurrentTask.Status = TTaskStatus.Canceled then
          break;
        Sleep(10); // damit zeit vergeht ...
        TThread.Synchronize(nil, procedure()
          begin
            Button1.Text := DateTimeToStr(Now);
          end);
      end;
      TThread.Synchronize(nil, procedure()
        begin
          Button1.Enabled := true;
          Button1.Text := 'Start Task'; // beschriftung wiederherstellen
        end);
    end);
Hilft das?
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:06 Uhr.
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