Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android App "Reagiert nicht mehr, Warten oder Beenden"? (https://www.delphipraxis.net/192746-android-app-reagiert-nicht-mehr-warten-oder-beenden.html)

sko1 16. Mai 2017 14:47

Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
Hallo,

bei einer sehr langen Datenbank-Operation (kann auch mal 5 Minuten benötigen) kommt irgendwann von Android obige Meldung, obwohl ich immer wieder in der Datenbank-Abarbeitungsschleife Application.ProcessMessages aufrufe.

Muss man unter Android dem Betriebssystem irgendwie anders mitteilen, dass man "noch am Leben" ist?

Ciao
Stefan

DeddyH 16. Mai 2017 14:53

AW: Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
http://blog.marcocantu.com/blog/2014...d_threads.html

sko1 18. Mai 2017 09:45

AW: Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
Hallo,

ich versuche jetzt auf Threads umzustellen, bekomme beim

Delphi-Quellcode:
Thread.Resume;


eine Warnung, das wäre deprecated!

Da ich ungern so was verwende, was wäre die Alternative?

Ciao
Stefan

SebastianZ 18. Mai 2017 09:51

AW: Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
Zitat:

Zitat von sko1 (Beitrag 1371858)
Hallo,

ich versuche jetzt auf Threads umzustellen, bekomme beim

Delphi-Quellcode:
Thread.Resume;
eine Warnung, das wäre deprecated!

Da ich ungern so was verwende, was wäre die Alternative?

Ciao
Stefan

Thread.Resume ist generell nicht zu empfehlen, da der Thread genau dort unterbrochen wird, wo er gerade steht, was unschöne Nebenwirkungen haben kann.
Wenn du den Thread pausieren musst, würde ich deinem Thread-Objekt eine Variable verpassen die das ganze steuert.

Delphi-Quellcode:
  TMyThread = class(TThread)
    procedure Execute; override;
  public
    LassLaufen: Boolean;
  end;

procedure TMyThread.Execute;
begin
  while Abbruchbedinung <> True do
  begin
    if LassLaufen then
    begin
      //Hier wichtiger Code der nicht unterbrochen werden soll
    end else Sleep(10);
  end;
end;
Alternativ zu TThread könntest du dir auch den TTask ansehen.

sko1 18. Mai 2017 10:16

AW: Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
Danke, das war der richtige Denkanstoß!

Ich wollte Resume nicht zum Anhalten/Starten verwenden sondern nur starten nach Create (suspended = true) aber dafür findet sich ja dann Thread.Start :-)

Ein anderes Problem hat sich dabei aber trotzdem aufgetan:

In einer Android-App kann man die Back-Taste drücken und dann ist das Programm geschlossen, der Thread läuft aber noch weiter!

Jetzt suche ich eine Möglichkeit, im OnKeyUp eines Formulars zu prüfen ob der Thread noch lebt.
Bevor er erzeugt wurde, kann man Nil abfragen, war er aber schon mal gestartet dann funktioniert Nil nicht mehr...

Was wäre der richtige Weg, muss ich eine globale Variable setzen, die der Thread dann, wenn er fertig ist, rücksetzt?

Ciao
Stefan

SebastianZ 19. Mai 2017 07:41

AW: Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
Du kannst entweder das Terminated-Kennzeichen des Threads verwenden, oder selbst eine property im Thread mitführen die den Status ausweist.

Falls der Thread mit .Terminate beendet wird und gesichert ist, dass er nach dem Terminate sehr zeitnah das arbeiten einstellt, kannst du das Terminted prüfen. Falls es nach dem Terminate noch eine weile weiterläut würde ich eine eigene Variable benutzen.

sko1 19. Mai 2017 10:37

AW: Android App "Reagiert nicht mehr, Warten oder Beenden"?
 
Ich habe es über eine globale Variable gelöst, funktioniert wie ich mir das vorstelle...

Ciao
Stefan


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