AGB  ·  Datenschutz  ·  Impressum  







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

Thread in mobiler App beenden

Ein Thema von sko1 · begonnen am 14. Mär 2018 · letzter Beitrag vom 14. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2      
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Thread in mobiler App beenden

  Alt 14. Mär 2018, 10:03
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!

Geändert von sko1 (14. Mär 2018 um 10:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 11:12
Wie wäre es wenn Du in dem Thread eine Abfrage einbaust ob die App noch läuft?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 11:27
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 11:40
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 11:45
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 12:04
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 12:30
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 13:27
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).
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
588 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 13:29
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Thread in mobiler App beenden

  Alt 14. Mär 2018, 13:41
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:50 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