![]() |
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 |
AW: ActivityIndicator nach dem Programmstart
Mit einem Thread und den kannst du quasi sofort starten
|
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... |
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 |
AW: ActivityIndicator nach dem Programmstart
Zitat:
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. |
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:
|
AW: ActivityIndicator nach dem Programmstart
Zitat:
|
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? |
AW: ActivityIndicator nach dem Programmstart
Ja natürlich.
Delphi-Quellcode:
Procedure TMainFormular.FormCreate(Sender : TObject);
Begin SplashScreen.Show(); MachHierAllesWasGeladenWerdenSoll(); SplashScreen.Hide(); End; |
AW: ActivityIndicator nach dem Programmstart
Entweder willst du mich trollen oder du hast wirklich keine Ahnung...
|
AW: ActivityIndicator nach dem Programmstart
Zitat:
|
AW: ActivityIndicator nach dem Programmstart
Du weißt um was es geht? iOS und so?
|
AW: ActivityIndicator nach dem Programmstart
Zitat:
|
AW: ActivityIndicator nach dem Programmstart
Zitat:
|
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. |
AW: ActivityIndicator nach dem Programmstart
Okay, mal ein Beispiel: Das hier will ich zum Laufen bekommen
Delphi-Quellcode:
Was passiert?
procedure TForm1.FormShow(Sender: TObject); // Gleiches Ergebnis im OnFormCreate
begin ZeigeActivityIndicator('test'); Sleep(10000); VersteckeActivityIndicator end; 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 lassenEin Thread würd das Problem lösen, aber 1000 andere aufwerfen. |
AW: ActivityIndicator nach dem Programmstart
Zitat:
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:
Mal sehen, was Du jetzt antwortest.
Procedure VielArbeit();
Begin ZeigDenActivityIndicator(); Schritt1; StubsDenActivityIndicator(); Schritt2; StubsDenActivityIndicator(); ... VerbergeDenActivityIndicator(); End; |
AW: ActivityIndicator nach dem Programmstart
Zitat:
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) |
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 |
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. |
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:
|
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. |
AW: ActivityIndicator nach dem Programmstart
Zitat:
Zitat:
![]() ![]() ![]() 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) |
AW: ActivityIndicator nach dem Programmstart
Zitat:
|
AW: ActivityIndicator nach dem Programmstart
Zitat:
Wenn Fragen auftauchen einfach mal her damit. Diesen Link solltest du dir mal anschauen ![]() |
AW: ActivityIndicator nach dem Programmstart
Zitat:
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: |
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 07:27 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