Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Thread in mobiler App beenden (https://www.delphipraxis.net/195619-thread-mobiler-app-beenden.html)

sko1 14. Mär 2018 09:03

Thread in mobiler App beenden
 
Hallo,

in einer Android-App verwende ich einen Thread der im Hintergrund Datenbankarbeiten erledigt.
Dieser wird im OnCreate des HauptForms erzeugt und im OnDestroy wieder "entsorgt".

Nun sollen ja Apps beim "Schließen" im Hintergrund weiterarbeiten, was meine App auch tut.

Nun ist mir aufgefallen, dass das OnDestroy ja nie aufgerufen wird, wenn ich das Programm mit dem "Android-Taskmanager" (linke Softtaste) beende wird es komplett abgeschossen!
Dabei scheint der Thread aber weiter zu laufen...
Wie würdet Ihr vorgehen um das sauber zu lösen?

Ciao
Stefan

Nachtrag:
Ich habe noch ein wenig getestet:
Tread im OnShow / OnHide erzeugen und zerstören
Tread im OnActivate / OnDeactivate erzeugen und zerstören

Weder OnHide noch OnDeactivate wird beim Schieben der App in den Hintergrund (oder öffnen einer anderen App) ausgelöst!

KodeZwerg 14. Mär 2018 10:12

AW: Thread in mobiler App beenden
 
Wie wäre es wenn Du in dem Thread eine Abfrage einbaust ob die App noch läuft?

sko1 14. Mär 2018 10:27

AW: Thread in mobiler App beenden
 
Hast Du eine Idee dazu?

Inzwischen habe ich den Event FormSaveState gefunden, der gefeuert wird wenn die App in den Hintergrund geht.
Hier habe ich dann

Delphi-Quellcode:
procedure TFormMain.FormSaveState(Sender: TObject);
begin
  if kThread <> nil then
  begin
    kThread.Terminate;
    kThread.WaitFor;
    kThread.Destroy;
    kThread := Nil;
  end;
end;
und dann

Delphi-Quellcode:
procedure TFormMain.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
  if kThread = nil then
    kThread := TKalenderThread.create;
end;
in der Hoffnung, dass beim schieben der App in den Hintergrund der Thread beendet wird und beim Paint der Form wieder einer erzeugt wird falls er noch nicht existiert.

Das funktioniert soweit:
- App starten, Thread wird erzeugt
- App in den Hintergrund, FormSaveState wird gefeuert und der Thread zerstört
- App wieder vorholen, Thread Create läuft fehlerfrei durch aber dann "Segmentation fault (11) und illegal instruction (4)!

Im Thread habe ich alles per try/except abgesichert, da läuft er nirgends rein!


Ciao
Stefan

KodeZwerg 14. Mär 2018 10:40

AW: Thread in mobiler App beenden
 
Mit Android/iOS kenne ich mich nicht gut aus, unter Windows würde ich ein MUTEX in App setzen (&entfernen im OnClose) lassen und im Thread hin-und-wieder abfragen ob der MUTEX noch gesetzt ist oder ob der Prozess X noch geladen ist. Wie die Möglichkeiten mit so etwas bei non-Windows vonstatten geht, tut mir leid, da bin ich ratlos.

sko1 14. Mär 2018 10:45

AW: Thread in mobiler App beenden
 
Da beisst sich die Katze ja wieder in den Schwanz!

Es gibt keinen Event wenn das Programm abgeschossen wird, also keine Stelle wo ein Mutex (falls überhaupt von Android ermöglicht) zu entfernen, demzufolge kann der Thread auch nicht mitbekommen wenn das Programm selbst abgeschossen wurde!

Ich denke das FormSaveState zum Beenden des Threads ist schon der richtige Weg, nur finde ich die Ursache der Laufzeitfehler nicht wenn der Thread dann wieder neu erstellt werden soll!


Ciao
Stefan

himitsu 14. Mär 2018 11:04

AW: Thread in mobiler App beenden
 
Wenn das Programm (der Prozess) abgeschossen wurde, dann läuft auch der Thread nicht mehr und kann somit auch nicht mehr machen.

Aber grade bei den mobilen Betriebssystemen werden Programme ofrmals garnicht beendet, sondern nur "pausiert" ... Anwendung und Thread werden nicht beendet/abgeschossen, sondern angehalten und beim nächsten Start der Anwendung wieder fortgesetzt.

sko1 14. Mär 2018 11:30

AW: Thread in mobiler App beenden
 
Zitat:

Wenn das Programm (der Prozess) abgeschossen wurde, dann läuft auch der Thread nicht mehr und kann somit auch nicht mehr machen.
Bist Du Dir da ganz sicher?
Das bedeutet wenn die App "abgeschossen wird" wird auch der Thread mit "abgeschossen"?

Zitat:

Aber grade bei den mobilen Betriebssystemen werden Programme ofrmals garnicht beendet, sondern nur "pausiert" ... Anwendung und Thread werden nicht beendet/abgeschossen, sondern angehalten und beim nächsten Start der Anwendung wieder fortgesetzt.
Das ist mir bekannt, meine App läuft ja auch im Hintergrund weiter!
Nur beim "Abschuss" wird der Thread, wie Du schreibst, ja auch abgeschossen, d.h. undefiniert (vielleicht gerade beim Datenbank schreiben) beendet?

Genau das will ich verhindern, sprich mit einer bestimmten Bedingung (jetzt im FormSaveState) den Thread gezielt terminieren und dann wenn das Programm wieder in den Vordergrund kommt, wieder starten.

Das hätte den Vorteil, dass man das Programm, welches im Hintergrund läuft, abschießen kann und der Thread ist zu diesem Zeitpunkt nicht vorhanden...

Da fällt mir aber gerade auf: was passiert wenn die App im Vordergrund liegt und abgeschossen wird?
Dann wird der Thread ja auch an einer x-beliebigen Stelle abgebrochen!

Dafür muss es doch eine Lösung geben, ich bin dich bestimmt nicht der einzige mit einem Thread und einer App die "abgeschossen werden kann"?

Ciao
Stefan

KodeZwerg 14. Mär 2018 12:27

AW: Thread in mobiler App beenden
 
Zitat:

Zitat von sko1 (Beitrag 1396074)
Wenn das Programm (der Prozess) abgeschossen wurde, dann läuft auch der Thread nicht mehr und kann somit auch nicht mehr machen.

Nur wenn der Thread so erstellt wurde. Es gibt seit Ewigkeiten TSR's (Terminate and Stay Resident) wo ein Prozess einen (oder viele) Thread erstellt und sich selbst schließt wobei der Thread weiterarbeitet, total unabhängig vom Prozess (Loader).

sko1 14. Mär 2018 12:29

AW: Thread in mobiler App beenden
 
Zitat:

Nur wenn der Thread so erstellt wurde.
Kannst Du das bitte mit 2 Zeilen Code zeigen wie man einen Thread erstellt der sich beim Beenden des Hauptprogramms automatisch mit zerstört?

Ciao
Stefan

KodeZwerg 14. Mär 2018 12:41

AW: Thread in mobiler App beenden
 
Mit Deinem "TKalenderThread.create;" macht Du es richtig, somit bleibt das leeren/schließen des Threads dem OS vorbehalten.
Also sollte eigentlich auch der Thread mit zu sein, um dem Thread noch was abarbeiten zu lassen bevor der Prozess geschlossen wird, kann man unter Windows auch noch auf Notify-Events reagieren, gibt es Notifies auch für non-Windows?

Ps: Soweit ich mich erinner ist bei Android der Speichermanager dafür verantwortlich was alles geladen ist und was tatsächlich aus dem Speicher geworfen wird, in der Regel bleibt alles nach dem Schließen noch geladen bis der Speicher knapp wird, dann wird pö a pö mehr Speicher von geschlossenen Anwendungen freigegeben. Ob man ein entleeren forcieren kann = ungewiss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 Uhr.
Seite 1 von 2  1 2      

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