Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   FMX-Android - Kein Hinweis "busy" möglich? (https://www.delphipraxis.net/213315-fmx-android-kein-hinweis-busy-moeglich.html)

dynamo 7. Jul 2023 10:52

FMX-Android - Kein Hinweis "busy" möglich?
 
Ich habe folgendes Problem unter Delphi11.3 FMX-Android32/64:

auf einen ButtonClick wird ein Datentrasfer ausgelöst. Und zwar werden Mysql-Daten von meiner Netzwerkfestplatte auf mein Handy transferiert.
Für den Zugriff auf die Mysqldaten benutze ich die Devart-Komponente TMyQuery, und für die Überspielung aufs Handy die TFDQuery.
Das Ganze funktiert absolut reibungslos und ist auch eigentlich nicht das Thema hier. Aber da der Datentransfer etwas Zeit dauert, soll der Anwender
darüber informiert werden, dass das System gerade mit etwas beschäftigt ist. Ich dachte an simple Dinge wie z.B. einen Hinweistext an ein TLabel zu geben.
Etwa in der Form:

Delphi-Quellcode:
procedure TForm1.btn_createLocalDatasClick(Sender: TObject); // Aufruf aus dem Menü
begin
  lbl_hinweis.Text := 'erzeuge lokale Daten...';
  Application.ProcessMessages; // (hilft nicht, kann ich auch weglassen)
  createLocalDatas;
end;
Der Hinweisweistext wird auch angezeigt, aber leider erst dann, wenn der Datentransfer abgeschlossen ist. Nur dann brauch ich ihn auch nicht mehr.
Hilfsweise habe ich versucht, wenigstens mit Hilfe einer ColorAnimation zu signalisieren, dass der Button gedrückt wurde.
Macht er auch, aber leider erst nachdem der Datentransfer abgeschlossen ist. Auch dann ergibt das keinen Sinn mehr.

Delphi-Quellcode:
procedure TForm1.createLocalDatas;
var s,st: string;i:Integer;MyQ2 : TMyQuery;FDQ2 : TFDQuery;
begin
  MyQ2 := TMyQuery.Create(nil);
  MyQ2.Connection := MyConn; // im onCreate - Ereignis von Form1 definiert
  FDQ2 := TFDQuery.Create(nil);
  FDQ2.Connection := FDConn; // im onCreate - Ereignis von Form1 definiert
 
  //-------- tbl_eintrag; -------------------
  s:= 'select * from '+ tbl_eintrag;
  MyQ2.SQL.Text := s;
  MyQ2.Open;
  MyQ2.First;
  i:=0;
  while not MyQ2.Eof do
  begin
//    lbl_hinweis.Text := 'erzeuge lokale Daten...'; // testweise auch mal an dieser Stelle versucht: keine Anzeige
//    application.ProcessMessages; // bringt nichts!
    inc(i);
    st:= MyQ2.FieldByName('_text').AsString;
    st:= parseRichtextToText(st);// aus RichText die Steuerzeichen entfernen (das dauert ...)

      FDQ2.SQL.Text := 'Insert into '+ tbl_eintrag+' (eintragnr,datum,_text,showtgtext) Values('+
                      i.ToString+', '+
                      quotedstr(MyQ2.FieldByName('datum').AsString)+', '+ 
                      quotedstr(st)+', '+
                      MyQ2.FieldByName('showtgtext').AsString+')';

      FDQ2.ExecSQL;
//      lbl_hinweis.Text := 'erzeuge lokale Daten...'; // testweise auch mal an dieser Stelle versucht: keine Anzeige
//      application.ProcessMessages; // bringt nichts!

    MyQ2.Next;
  end;

  FreeAndNil(FDQ2);
  FreeAndNil(MyQ2);

end;
Hat jemand eine Idee, wie ich es erreichen kann, dass zuerst der Hinweistext angezeigt, und dann erst die Transferprocedure ausgeführt wird -oder wenigstens während des Prozesses?
Ich brauche wohl nicht zu erwähnen, dass - wenn ich die Windows-Platform wähle, alles bestens funktioniert. Ich bin überzeugt davon, dass es auch
unter Delphi 10.2 so wäre. Aber irgendwas scheint ab Delphi 10.4 anders zu sein.

shebang 7. Jul 2023 11:58

AW: FMX-Android - Kein Hinweis "busy" möglich?
 
Eine Möglichkeit wäre das Verschieben der Arbeit in einen anonymen Thread.
Delphi-Quellcode:
procedure TForm1.btn_createLocalDatasClick(Sender: TObject); // Aufruf aus dem Menü
begin
  lbl_hinweis.Text := 'erzeuge lokale Daten...';
  TThread.CreateAnonymousThread(procedure begin
    createLocalDatas;
    TThread.Synchronize(nil, procedure begin
      lbl_hinweis.Text := 'fertig';
    end);
  end).Start();
end;

dynamo 7. Jul 2023 12:52

AW: FMX-Android - Kein Hinweis "busy" möglich?
 
Zitat:

Zitat von shebang (Beitrag 1524325)
Eine Möglichkeit wäre das Verschieben der Arbeit in einen anonymen Thread.

Ja, das funzt bedingt: Der Hinweistext erscheint sofort, und die CreateDatas-Procedure wird auch durchlaufen. Soweit alles gut! Aber wenn die procedure fertig ist, erscheint kein Hinweis: "fertig". Wie krieg ich das noch hin? Der lbl_hinweis.Text bleibt bei 'erzeuge lokale Daten ...' stehen.

Rollo62 7. Jul 2023 15:55

AW: FMX-Android - Kein Hinweis "busy" möglich?
 
Versuch mal den Synchronize durch Queue zu ersetzen, das ist in der Regel unkritisch

Delphi-Quellcode:
    TThread.Synchronize(nil, procedure

    TThread.Queue(nil, procedure

dynamo 7. Jul 2023 17:05

AW: FMX-Android - Kein Hinweis "busy" möglich?
 
Zitat:

Zitat von Rollo62 (Beitrag 1524332)
Versuch mal den Synchronize durch Queue zu ersetzen, das ist in der Regel unkritisch

Das hatte ich auch schon versucht. Es bleibt dabei: lbl_hinweis.text erscheint sofort und createLocalDatas wird durchlaufen, aber der Hinweistext bleibt danach stur erhalten. Ich hatte auch schon versucht, am Ende der createLocalDatas-procedure einen 2. Thread zu machen, in dem der Hinweistext wieder verschwinden soll - Pustekuchen! Ich's auch schon mit ITask versucht:

Delphi-Quellcode:
procedure TForm1.btn_createLocalDatasClick(Sender: TObject); // Aufruf aus dem Menü
var aTask: ITask;
begin
  lbl_hinweis.Text := 'erzeuge lokale Daten...';
  aTask := TTask.create(
  procedure
  begin
    createLocalDatas;

    TThread.Queue(nil, // oder .synchronize(nil ...
            procedure
            begin
              lbl_hinweis.Text := 'fertig';
            end);

  end);
  aTask.Start;
end;
Hat leider auch nichts gebracht. Es ist zum Verzweifeln!

Rollo62 7. Jul 2023 18:03

AW: FMX-Android - Kein Hinweis "busy" möglich?
 
Bist Du sicher dass nichts Anderes den
Delphi-Quellcode:
lbl_hinweis.Text
wieder zurücksetzen kann ?
Funktioniert das Label wenn
Delphi-Quellcode:
//createLocalDatas;
auskommentiert ist ?
Wenn der Debugger bis zum
Delphi-Quellcode:
lbl_hinweis.Text := 'fertig';
kommt, sollte es eigentlich funktionieren.
Wird irgendwo bei Dir im Code
Delphi-Quellcode:
Application.ProcessMessages;
verwendet ?

dynamo 7. Jul 2023 20:12

AW: FMX-Android - Kein Hinweis "busy" möglich?
 
Zitat:

Zitat von Rollo62 (Beitrag 1524336)
Wird irgendwo bei Dir im Code
Delphi-Quellcode:
Application.ProcessMessages;
verwendet ?

Verdammt! Das hatte sich in der Procedure CreateLocalDatas doch tatsächlich noch versteckt!
ich habe
Delphi-Quellcode:
Application.ProcessMessages;
rausgenommen, und jetzt funktioniert's.
Vielen Dank für den entscheidenden Tipp.
Es funktioniert sowohl mit TThread.synchronize(... als auch mit TThread.Queue(...


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