Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS ActivityIndicator nach dem Programmstart (https://www.delphipraxis.net/178647-activityindicator-nach-dem-programmstart.html)

Crocotronic 19. Jan 2014 13:55


ActivityIndicator nach dem Programmstart
 
Hallo,
beim Programmstart werden in meiner App Daten heruntergeladen. Jetzt habe ich das Problem, dass der Splash-Screen erst verschwindet, wenn alles heruntergeladen wurde. Da das aber etwas länger gehen kann, soll der User natürlich darüber informiert werden (mit einem ActivityIndicator), was die App gerade macht.
Das Runterladen starte ich im OnFormShow.
Weiß jemand, wie ich das ganze ohne einen Timer lösen kann?

Viele Grüße
Croco

Sir Rufo 19. Jan 2014 13:57

AW: ActivityIndicator nach dem Programmstart
 
Mit einem Thread und den kannst du quasi sofort starten

Crocotronic 19. Jan 2014 14:04

AW: ActivityIndicator nach dem Programmstart
 
Da der User während dem Herunterladen bzw. ohne die Daten eh nichts machen darf, wäre ein Thread unvorteilhaft. Außerdem sind Threads bei mir eine zu hohe Gefahrenquelle :stupid:
Geht das nicht noch anders? Dachte zuerst an Application.Processmessage, aber das hat unter iOS ja keine Wirkung...

Sir Rufo 19. Jan 2014 14:41

AW: ActivityIndicator nach dem Programmstart
 
Du hast einen Thread für UI und eben nur für UI.
Also ab in den Hintergrund, denn da gehört das hin

Mavarik 19. Jan 2014 14:51

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244353)
Da der User während dem Herunterladen bzw. ohne die Daten eh nichts machen darf, wäre ein Thread unvorteilhaft. Außerdem sind Threads bei mir eine zu hohe Gefahrenquelle :stupid:
Geht das nicht noch anders? Dachte zuerst an Application.Processmessage, aber das hat unter iOS ja keine Wirkung...

Gefahrenquelle?

Worin soll die Gefahr bestehen?

Application.Processmessage, aber das hat unter iOS ja keine Wirkung...?

Habe ich da etwas verpasst?

Wenn Du z.B. einen OnClick auf eine Listbox hast die den "blauen Focus" annehmen soll oder einen Button Disablen willst im OnClick bevor die Verarbeitung beginnt, wird der Screen nicht ohne ein Application.Processmessage aktualisiert.

Im OnFormShow eine längere Verarbeitung mag zwar im Debug Modus funktionieren aber nicht mit einer App aus dem AppStore. Wenn die nicht schnell genug startet wird die automatisch beendent.

Beispiel: http download über GPRS... Geht auf keinen Fall.

Crocotronic 19. Jan 2014 15:44

AW: ActivityIndicator nach dem Programmstart
 
Wenn ich an Threads denke, denk ich z.B. an unvorhergesehene Ereignisse oder gar Abstürze. Ich benutzt Threads wirklich nur, wenn es sein muss. Und wie schon gesagt, wäre in meinem Fall ein Thread nur kontraproduktiv.
Zitat:

Zitat von Mavarik (Beitrag 1244368)
Application.Processmessage, aber das hat unter iOS ja keine Wirkung...?

Ich bin einfach mal davon ausgegangen, da es bei mir in allen Versuchen nicht das Ergebnis gebracht hat, das ich erwartete (bzw. sich nicht so verhalten hat, wie unter VCL).
Zitat:

Zitat von Mavarik (Beitrag 1244368)
Im OnFormShow eine längere Verarbeitung mag zwar im Debug Modus funktionieren aber nicht mit einer App aus dem AppStore. Wenn die nicht schnell genug startet wird die Automatisch beendent.

Deshalb will ich ja, dass das Programm erst fertig läd (also alles anzeigt etc.), und dann das Herunterladen beginnt (aber im Main-Thread).

Furtbichler 19. Jan 2014 16:59

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244379)
Wenn ich an Threads denke, denk ich z.B. an unvorhergesehene Ereignisse oder gar Abstürze.

Und wenn ich an eine Ampel denke, denke ich immer an Unfälle, Tod, Invalidität.:stupid:

Crocotronic 19. Jan 2014 17:03

AW: ActivityIndicator nach dem Programmstart
 
Ach, du auch?

Spaß bei Seite....
Es wird doch möglich sein, das Programm erst fertig laden zu lassen, bevor etwas ausgeführt wird?

Furtbichler 19. Jan 2014 17:05

AW: ActivityIndicator nach dem Programmstart
 
Ja natürlich.
Delphi-Quellcode:
Procedure TMainFormular.FormCreate(Sender : TObject);
Begin
  SplashScreen.Show();
  MachHierAllesWasGeladenWerdenSoll();
  SplashScreen.Hide();
End;

Crocotronic 19. Jan 2014 17:26

AW: ActivityIndicator nach dem Programmstart
 
Entweder willst du mich trollen oder du hast wirklich keine Ahnung...

Sir Rufo 19. Jan 2014 17:31

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244406)
Entweder willst du mich trollen oder du hast wirklich keine Ahnung...

Wieso, du willst doch keinen extra Thread. Dann geht das so - eben nicht toll, aber du willst es doch so.

Crocotronic 19. Jan 2014 17:34

AW: ActivityIndicator nach dem Programmstart
 
Du weißt um was es geht? iOS und so?

Furtbichler 19. Jan 2014 17:35

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244406)
oder du hast wirklich keine Ahnung...

Ertappt. Ich tu immer nur so. Aber Du kannst es ja trotzdem einfach mal so ausprobieren.

Sir Rufo 19. Jan 2014 18:15

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244409)
Du weißt um was es geht? iOS und so?

Ja, deswegen ja auch der Hinweis von mir auf den separaten Thread.

Furtbichler 19. Jan 2014 18:38

AW: ActivityIndicator nach dem Programmstart
 
Ich kenne IOS nicht, aber ich vermute, das es sich auch um ein Betriebssystem handelt, welches noch auf den normalen SISD-CPUs in klassischer Von-Neumann-Architektur aufbaut. Danach wäre es eine serielle Abfolge von Befehlen, die Du umzusetzen gedenkst. Obwohl das bescheuert ist und beim FMX im Detail vermutlich anders ausschaut, ist es doch so, das Du einfach deine Befehle zum kompletten Laden ausführen musst, bevor das Haupformular sichtbar wird.
So wie ich die API durchschaue, ist sie wirklich der VCL nachempfunden, sodaß mein Code vermutlich so oder ähnlich doch funktionieren könnte.

Crocotronic 19. Jan 2014 18:42

AW: ActivityIndicator nach dem Programmstart
 
Okay, mal ein Beispiel: Das hier will ich zum Laufen bekommen
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject); // Gleiches Ergebnis im OnFormCreate
begin
 ZeigeActivityIndicator('test');
 Sleep(10000);
 VersteckeActivityIndicator
end;
Was passiert?
Der Splash-Screen erscheint solange, bis die 10 Sekunden rum sind.
Was soll es tun?
Das Formular anzeigen und ein ActivityIndicator 10 Sekunden lang kreiseln lassen
Ein Thread würd das Problem lösen, aber 1000 andere aufwerfen.

Furtbichler 19. Jan 2014 18:48

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244428)
Ein Thread würd das Problem lösen, aber 1000 andere aufwerfen.

Quatsch. Versuche es mal mit Dazulernen, Du gehst doch mittlerweile auch ohne Mutti über ne grüne Ampel, ne wahr?
Aber wenn Du eben partout allergisch auf Threads (und damit auf den Ansatz professioneller Software) bist, dann musst Du eben anders ans Ziel kommen:
Anstatt also einen Helfer vor die Tür zu schicken, der vor dieser Auf und Ab geht und ein Schild 'I am the Activity Indicator' vor sich her dreht, während im Hinterstübchen die Arbeit gemacht wird, mach die Arbeit halt auf der Straße und renne alle paar Arbeitsschritte nach vorne, dreh kurz am Schild und mach dann weiter, wenn Du verstehst, was ich meine.
Delphi-Quellcode:
Procedure VielArbeit();
Begin
  ZeigDenActivityIndicator();
  Schritt1;
  StubsDenActivityIndicator();
  Schritt2;
  StubsDenActivityIndicator();
  ...
  VerbergeDenActivityIndicator();
End;
Mal sehen, was Du jetzt antwortest.

Crocotronic 19. Jan 2014 19:24

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Furtbichler (Beitrag 1244431)
Anstatt also einen Helfer vor die Tür zu schicken, der vor dieser Auf und Ab geht und ein Schild 'I am the Activity Indicator' vor sich her dreht, während im Hinterstübchen die Arbeit gemacht wird, mach die Arbeit halt auf der Straße und renne alle paar Arbeitsschritte nach vorne, dreh kurz am Schild und mach dann weiter, wenn Du verstehst, was ich meine.

Es geht mir in erster Linie doch gar nich um das "Schild", sondern um das Problem, dass der User die 10 Sekunden auf den Splash-Screen guckt, anstatt auf das Formular! Alles, was ich will ist, dass die Arbeit erst gestartet wird, wenn das verdammte Formular fertig geladen wurde und alle Controls schön angezeigt werden.
Ein Thread wäre in meinem Fall völlig overdressed, weil bevor die Handlung abgeschlossen ist, nichts anderes passieren darf. Außerdem würde es z.B. Probleme mit dem Datenbankzugriff geben (sqlite->ein Zugriff zur selben Zeit)

Mavarik 19. Jan 2014 20:26

AW: ActivityIndicator nach dem Programmstart
 
@Furtbichler Nein das geht nicht unter iOS... Abgesehen davon ist der SplashScreen im Systemkern und kann/muss nicht manuell aufgerufen werden.

So und jetzt noch mal:

Du hast ca. 1-2 Sekunden Zeit bis die App im ersten Application Idle sich im iOS Systemkern meldet als "ich bin geladen".

Wenn Du im 1. FormOnShow länger brauchst, wirst Du vom iOS Betriebssystem SOFORT terminiert!


Mavarik

Crocotronic 19. Jan 2014 20:35

AW: ActivityIndicator nach dem Programmstart
 
Also wäre das einfachste Workaround, im OnFormShow ein Timer (Interval auf 10 ms oder so) zu starten, der nur einmal ausgeführt wird?
Das ganze in ein Thread zu packen würde jetzt viel zu viel arbeit machen, da eigentlich schon fast alles fertig ist.

Sir Rufo 19. Jan 2014 21:19

AW: ActivityIndicator nach dem Programmstart
 
Das stimmt, es ist zu aufwendig den Code zum Laden in die Execute Methode zu verfrachten und das OnTerminate Event mit der MainForm zu verbinden, um dann die Form freizugeben. :roll:

Crocotronic 19. Jan 2014 21:49

AW: ActivityIndicator nach dem Programmstart
 
Scherzkeks.
Ich habe nicht erwähnt, dass bei der "Aufgabe" Assoziationen zu 4 anderen Objekten bestehen, mit unter auch der GUI.

Sir Rufo 19. Jan 2014 22:07

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244461)
Scherzkeks.
Ich habe nicht erwähnt, dass bei der "Aufgabe" Assoziationen zu 4 anderen Objekten bestehen, mit unter auch der GUI.

Evtl. hast du vergessen, was du machen wolltest
Zitat:

Zitat von Crocotronic
beim Programmstart werden in meiner App Daten heruntergeladen

Lad das im Threadkontext herunter, befülle die Objekte (evtl. sperren mit Delphi-Referenz durchsuchenTCriticalSection und die GUI kannst du zwischendurch auch mit Delphi-Referenz durchsuchenTThread.Synchronize bzw. besser mit Delphi-Referenz durchsuchenTThread.Queue bearbeiten.

Ich vermute aber mal, dass du da zu kompliziert denkst und dort einiges vermischst.

Wenn mit der GUI nicht gearbeitet werden kann (warten) dann kann das Bearbeiten von GUI Objekten auch warten bis der Thread fertig ist. Die Daten liegen ja eh nicht in den GUI Objekten (oder etwa doch, dann ist es ein Designfehler)

Crocotronic 19. Jan 2014 22:20

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Sir Rufo (Beitrag 1244464)
Lad das im Threadkontext herunter, befülle die Objekte (evtl. sperren mit Delphi-Referenz durchsuchenTCriticalSection und die GUI kannst zwischendurch auch mit Delphi-Referenz durchsuchenTThread.Synchronize bzw. besser mit Delphi-Referenz durchsuchenTThread.Queue bearbeiten.

Nagut, du hast mir Mut gemacht, meine Angst gegenüber Threads zu überwinden :D Werde mich morgen mal dran machen...

Sir Rufo 19. Jan 2014 22:23

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244466)
Zitat:

Zitat von Sir Rufo (Beitrag 1244464)
Lad das im Threadkontext herunter, befülle die Objekte (evtl. sperren mit Delphi-Referenz durchsuchenTCriticalSection und die GUI kannst zwischendurch auch mit Delphi-Referenz durchsuchenTThread.Synchronize bzw. besser mit Delphi-Referenz durchsuchenTThread.Queue bearbeiten.

Nagut, du hast mir Mut gemacht, meine Angst gegenüber Threads zu überwinden :D Werde mich morgen mal dran machen...

Geht doch :thumb:
Wenn Fragen auftauchen einfach mal her damit.

Diesen Link solltest du dir mal anschauen
http://www.uweraabe.de/Blog/2011/01/...th-parameters/

BUG 19. Jan 2014 22:49

AW: ActivityIndicator nach dem Programmstart
 
Zitat:

Zitat von Crocotronic (Beitrag 1244442)
Ein Thread wäre in meinem Fall völlig overdressed, ...

Wenigstens weißt du überhaupt, wie man einen Thread anzieht. Die meisten Leute lassen die nackt laufen.
Wenn zu viele nackte Threads in einem (Adress-)Raum herumlaufen, gibt es immer Probleme. Erst, wenn die dann in einen (Arbeiter-)Pool springen oder an einem Signal warten, hat man sie unter Kontrolle.


SCNR :mrgreen:

Mavarik 21. Jan 2014 15:11

AW: ActivityIndicator nach dem Programmstart
 
Nimm doch einfach als Startform ein leeres Form mit den Hinweis "Bitte warten bis alle Daten geladen"

Weil Apple "mag" es nicht wenn ein Vorscreen mit einem Button bestätigt werden muss.
(Habs trotzdem so gemacht und geht auch problemlos in den AppStore)

Mavarik


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