AGB  ·  Datenschutz  ·  Impressum  







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

Android ANR Wait

Ein Thema von Gruber_Hans_12345 · begonnen am 14. Nov 2024 · letzter Beitrag vom 19. Nov 2024
Antwort Antwort
Benutzerbild von wjjw
wjjw

Registriert seit: 3. Aug 2017
Ort: Wiener Neustadt, Österreich
75 Beiträge
 
Delphi 12 Athens
 
#1

AW: Android ANR Wait

  Alt 19. Nov 2024, 09:36
Hallo!

Hab das selbe Problem.
Ein einfaches Sleep(5000) bringt die Endlosmeldung (alle 5 Sekunden) "Projekt reagiert nicht - App schließen / Warten"!

Einfacher Code zum Testen:
Delphi-Quellcode:
procedure TForm1.Sl(sec: Integer);
var s: String;
    t1, t2: TDateTime;
begin
   t1 := Now;
   Sleep(sec * 1000);
   t2 := Now;
   s := 'Sleep(' + IntToStr(sec * 1000) + '): ';
   s := s + FormatDateTime('h:n:s.z', t1);
   s := s + ' to ';
   s := s + FormatDateTime('h:n:s.z', t2);
   Memo1.Lines.Add(s);
end;
Ergebnisse:
Sl(4) -> Memo1 -> 10:18:00.000 to 10:18:04.000
Sl(8) -> Memo1 -> 10.18.00.000 to 10.18:05.096 (also wird nach 5 Sekunden abgebrochen statt der gewünschter 8)!

Das heisst auch er bricht in Mitten der Sleep-Funktion nach 5 Sekunden ab.
Ich frage mich nur wenn ein Code "unerwarteterweise" länger als 5 Sekunden läuft, welche unerwarteten Effekte das haben kann.
Bei "erwarteten" Aktionen die länger dauern können eh kein Problem.

Und das heisst das das alles war nur irgendwie länger dauern KÖNNTE ich es als TThread / TTask implementieren muss.
Das es für diesen Zweck nichts einfacheres und sicheres gibt.
Es wäre ja auch ok wenn der Dialog nicht periodisch immer wieder kommen würde, wenn doch es die Aktion bereits beendet ist ->
ODER soll ich statt Sleep(8000) ein Sleep(4000) und danach ein Sleep(4000) einbauen (simpel dargestellt)??

Ich könnte die ganze App in einen 2. Thread packen...
Werner Weiß
--
Werner
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.208 Beiträge
 
Delphi 12 Athens
 
#2

AW: Android ANR Wait

  Alt 19. Nov 2024, 10:21
... Ich könnte die ganze App in einen 2. Thread packen...
Man sollte längerdauernde Tasks in einen Thread packen.
Wie gesagt, bei mir passiert das häufig beim Debuggen, wo ich verstehen kann dass die Debugger features schonmal blockieren können.
Die App selber sollte besser nicht blockieren.
  Mit Zitat antworten Zitat
Benutzerbild von wjjw
wjjw

Registriert seit: 3. Aug 2017
Ort: Wiener Neustadt, Österreich
75 Beiträge
 
Delphi 12 Athens
 
#3

AW: Android ANR Wait

  Alt 19. Nov 2024, 10:34
Hab mir die Delphi-Doku diesbezüglich nochmal angesehen.
Sogar deren Beispiele funktionieren nicht...
Das Bespiel in Android sage auch das die App nicht reagiert (nach WaitAll auf 2 Tasks - 8 Sekunden).

https://docwiki.embarcadero.com/RADS...amming_Library

Delphi-Quellcode:
procedure TForm1.MyButtonClick(Sender: TObject);
var
  tasks: array of ITask;
  value: Integer;
begin
  Setlength (tasks ,2);
  value := 0;

 tasks[0] := TTask.Create (procedure ()
  begin
   sleep(3000);
   TInterlocked.Add (value, 3000);
  end);
 tasks[0].Start;

 tasks[1] := TTask.Create (procedure ()
   begin
   sleep (5000);
   TInterlocked.Add (value, 5000);
 end);
 tasks[1].Start;
 
 TTask.WaitForAll(tasks);
 ShowMessage ('All done: ' + value.ToString);
end;
Werner Weiß
--
Werner
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.208 Beiträge
 
Delphi 12 Athens
 
#4

AW: Android ANR Wait

  Alt 19. Nov 2024, 11:59
Das Beispiel "TTask from the Parallel Programming Library" ist ja nicht Android-spezifisch, sondern eher allgemein auf Windows gemünzt.

Es ist so, dass eine Funktion im Hintergrund noch eine Zeit weiter ausgeführt wird, bevor Android/Apple doese wirklich hart killen.
Das ist mehr für Aufräumarbeiten gedacht, bevor die App schliest, aber nicht zur permanenten Hintergrundverarbeitung.
So einfach ist das bei den Mobilen nicht mehr.

Vielleicht hakt es beim Sleep, was Android negativ aufstößt, Du könntest mal folgendes stattdessen versuchen, bei dem der Task aktiv bleibt.

Delphi-Quellcode:
Uses
    ...
    System.DateUtils
    ...

procedure TForm1.Button1Click(Sender: TObject);
var
 aTask: ITask;
begin
 aTask := TTask.Create(
   procedure
   var
       LDelay : TDateTime;
       LCount : Int64;
   begin
     LDelay := Now;

// sleep (3000); // 3 seconds

     LCount := 0;

     while MilliSecondsBetween( Now, LDelay ) < 5000 do
     begin
         //Loope brutalst hier herum, zähle mal zum Spass
         Inc( LCount );
     end;

     TThread.Synchronize(TThread.Current,
       procedure
       begin
         ShowMessage ('Hello ' + LCount.ToString );
       end);
   end);
   aTask.Start;
end;
  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 04:36 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