AGB  ·  Datenschutz  ·  Impressum  







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

Android & Application.Run

Ein Thema von Mavarik · begonnen am 22. Mär 2023 · letzter Beitrag vom 23. Mär 2023
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#1

Android & Application.Run

  Alt 22. Mär 2023, 13:04
Ich kann mich daran erinnern, das Threading Model von FMX für Android hat sich mal geändert. Aber ich kann mich nicht erinnern wann...

Normalerweise ist ein Application.Run ein Methodenaufruf, der erst dann zurück kommt, wenn die App/Anwendung geschlossen wird...

Nicht so auf Android.

Beispiel:

Delphi-Quellcode:
program Project94;

uses
  System.StartUpCopy,
  System.Messaging,
  FMX.Forms,
  Unit70 in 'Unit70.pas{Form70};

{$R *.res}

var
  S : String;
  IsSet : boolean;

begin
  Application.Initialize;

  S := 'Vorher';
  IsSet := false;
  Form70 := NIL;

  Application.CreateForm(TForm70, Form70);

  TMessageManager.DefaultManager.SubscribeToMessage( TFormsCreatedMessage,
    procedure( const Sender: TObject; const M: TMessage )
      begin
        if Assigned( Form70 ) and not IsSet then
          begin
            Form70.Label1.Text := S;
            IsSet := True;
          end;
      end );

  Application.Run;

  S := 'Nachher';
end.
Was steht auf dem Form? Richtig... "Nachher".

Wegen Java, wollen meine "alten" XE-Versionen nicht und ich habe leider keine VM mehr...

Hat jemand einen Idee?

Grüsse Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Android & Application.Run

  Alt 22. Mär 2023, 13:20
Wo liegt dabei denn das Problem? Es ist ja (wie du sicherlich selbst weißt) normal, dass unter Android Methoden auch zurückkehren bevor sie abgearbeitet sind, z.B. auch bei der Anzeige von Dialogen.

Beim Beenden der App etwas tun geht an der Stelle dann nicht, aber geht es dir darum?
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Android & Application.Run

  Alt 22. Mär 2023, 13:29
Beim Beenden der App etwas tun geht an der Stelle dann nicht, aber geht es dir darum?
Ich hatte eine "alten" Multiplattform App die nach dem Application.Run eine Message zu einen TCP-Server sendet und nicht einfach "weg geht". Klar kann man das auch anders lösen...

Aber ich habe einen ganzen Tag einen einer Exception gesucht...

Da der Debugger aber (11.3) erst dann connected wird, wenn Application.Run zurück gekommen ist (Hatte ich leider auch nicht "mehr" auf dem Schirm - mache wenn es geht einen großen Bogen um Android) kann man keinen Source in Unit Initializations und nix debuggen, bevor das nicht passiert ist.

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Android & Application.Run

  Alt 22. Mär 2023, 13:53
Da der Debugger aber (11.3) erst dann connected wird, wenn Application.Run zurück gekommen ist (Hatte ich leider auch nicht "mehr" auf dem Schirm - mache wenn es geht einen großen Bogen um Android) kann man keinen Source in Unit Initializations und nix debuggen, bevor das nicht passiert ist.
Mit der guten alten while true Schleife schon. Wenn die ganz am Anfang nach dem begin steht, kannst du alles debuggen, auch unter Android. (Gut, mit Delphi 11 habe ich das nicht getestet, aber ich gehe davon aus, dass das auch dort klappt.)
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Android & Application.Run

  Alt 22. Mär 2023, 15:15
Mit der guten alten while true Schleife schon. Wenn die ganz am Anfang nach dem begin steht, kannst du alles debuggen, auch unter Android.
emm - What?

Wenn Du in meinem Beispiel einen Breakpoint auf S := 'Vorher' setzt, hält der Debugger da nie an.

Und Du hast dafür einen Workaround?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Android & Application.Run

  Alt 22. Mär 2023, 21:21
Wenn Du in meinem Beispiel einen Breakpoint auf S := 'Vorher' setzt, hält der Debugger da nie an.

Und Du hast dafür einen Workaround?
Ja, das habe ich ja geschrieben.

Das klappt genauso wie das Debuggen des Startens eines Dienstes unter Windows:

2023-03-22.jpg

Sprich du packst nach dem begin im Projekt eine Schleife rein. Unter Windows kann das einfach while not IsDebuggerPresent do sein. Unter Android muss man das etwas abwandeln. Dort prüft man auf eine Variable. Setzt man dort einen Haltepunkt, kommt man trotzdem nicht an.
ABER: Wenn du nach dem Start an der Stelle bist, sprich den Startbildschirm der App siehst und es dort hängt, dann drückst du einfach auf Anhalten. Dann landest du an der Schleife und kannst dort die Variable mit Strg + F7 ändern. Wenn du dann fortsetzt, landest du bei den weiteren Haltepunkten ganz normal.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#7

AW: Android & Application.Run

  Alt 23. Mär 2023, 16:59
Ich hatte eine "alten" Multiplattform App die nach dem Application.Run eine Message zu einen TCP-Server sendet und nicht einfach "weg geht". Klar kann man das auch anders lösen...
Wäre nicht WillTerminate oder anderen Events die richtige Alternative ?
Habe ich nie gebraucht, aber ich meine, dass gestartete Threads noch bis zum Ende weiterlaufen, also ideal um eine Message zu TCP abzusetzen.
Bin mir aber jetzt auch nicht 100*% sicher, ob die bei Android nicht doch hart gekillt werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Android & Application.Run

  Alt 23. Mär 2023, 22:39
Bin mir aber jetzt auch nicht 100*% sicher, ob die bei Android nicht doch hart gekillt werden.
Im Windows laufen Threads auch ewig weiter, aber der Hauptthread (die böse RTL) schießt bei seinem Ende den ganzen Prozess ab.
Im Prinzip sind für Windows alle Threads gleich, also egal ob Hauptthread oder ein Anderer.

Ja, man könnte vielleich davon ausgehen, dass Windows den Thread, welchen es selber für die Programminitialisierung gestartet hat, eventuell anders behandelt ... aber scheinbar nö.

Hmmmm ... ob nun Unixoide (Linux oder Android) das anders handhaben ... gute Frage, aber warum sollten die denn einen der Threads (Hauptthread) bevorzugt behandeln?
$2B or not $2B

Geändert von himitsu (23. Mär 2023 um 23:30 Uhr)
  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 22:04 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