Wann ist eine Anwendung startbereit

Für Fragen von Einsteigern und Programmieranfängern...
Michl
Beiträge: 2424
Registriert: Di 19. Jun 2012, 12:54

Re: Wann ist eine Anwendung startbereit

Beitrag von Michl »

af0815 hat geschrieben:
So 16. Mai 2021, 14:29
Ich verwende seit Jahren und nicht nur bei Lazarus immer OnActivate mit einem InitFlag.
...
Ich habe gelernt micht nicht auf die Reihenfolge der Events zu verlassen
Aber genau das machst du hier. Ich gebe dir und allen vor dir recht, daß es vermutlich in fast allen Fällen funktioniert, jedoch nicht immer.

Eigentlich wollte ich auch gar nichts mehr dazu schreiben und den OP sich seine eigene Meinung bilden lassen. Kann das aber jetzt nicht so stehen lassen und habe mich doch fünf Minuten hingesetzt und ein kurzes Beispiel zusammengeklimpert. Es steht nur stellvertretend für größere Controls, die nicht mit Dreizeilern abzuarbeiten sind. Einmal kann man wunderbar einen SIGSEGV erzeugen im OnActivate, einmal läuft es problemlos durch, wenn man auf OnIdle wartet.

Code: Alles auswählen

procedure TForm1.FormActivate(Sender: TObject);
begin
//  Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle  := @ApplicationIdle;
end;

procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean);
begin
  Form2.Show;
end; 
Mir ist klar, daß man bei dem Minimalbeispiel noch diverse Hilfsvariablen oder Checks einführen kann, jedoch bei Drittkomponenten geht das nicht immer (TChromium ist z.B. so ein Kandidat).

af0815 hat geschrieben:
So 16. Mai 2021, 14:29
Zu den DB-Conntions, dort einen Autostart zu machen, ist eher was für Leute die auf Probleme stehen.
Was meinst du damit, kannst du das näher erklären? Lässt du deine User immer selbst erst die Verbindung zur Datenbank aufbauen?

Nur zum Verständnis, als Beispiel, hatte ich mal hier viewtopic.php?t=12658 kurz ein Projekt vorgestellt, was ohne eine automatische Verbindung zur Datenbank und zum Heizungsserver für uns keinen Nutzen hätte. Auf Dauer würde sich hier niemand hinstellen und die Verbindung nach einem Stromausfall oder Connection Lost manuell wieder herstellen.
Dateianhänge
Test_Started.zip
(2.37 KiB) 7-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

siro
Beiträge: 468
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Wann ist eine Anwendung startbereit

Beitrag von siro »

So, da bin ich wieder,
zunächst einmal Danke an euch für die Informationen,

ich habe mal einiges ausprobiert:

Um eine Reihenfolge zu beobachten, habe ich zunächtst ein statisches Array mit Strings in einer Unit Globals.pas angelegt.
Hier kann ich "jederzeit" die Procedure AddInfo('blabla'); aufrufen, auch wenn noch garnichts initialisiert ist.

Dann habe ich 2 Formulare, wobei ich das Form2 auch gleich auf "visible" gesetzt habe.

Zudem habe ich auf beide Formulare je einen Timer mit "Enabled" auf TRUE gesetzt, die laufen also auch sofort los.
Diverse Events der Formulare sowie Timer Events werden in das statische Stringarray eingetragen.
und zum Schluss bei Form1.Activate wird das Stringarray in der Procedure Gucken in die Liste eingetragen.
Hier tauchen, so wie gewollt, noch keine Timer Events auf.

Mit dem dem Druck auf den Button wird die Liste aktualisiert.
Nun sieht man auch das Timer Events aufgetreten sind, aber erst NACH OnActivate vom Hauptformular Form1.

Man kann bei diesem Beispiel sehen, dass die Strategie mit
OnActivate für das Hauptformular scheinbar eine gute Lösung ist.

Um die Problematik zu erhöhen, habe ich bei OnCreate vom Formular 2 eine 500ms Schleife eingebaut.
Auch das spielt keine Rolle, da passiert nichts ungewolltes. Es kommen noch keine Timerevents,
zumindest werden sie nicht verarbeitet...
Wenn ich jedoch in diese 500ms Schleife ProcessMessages rein setze, dann "wäre" das Chaos vorgrammiert.
Dann werden nämlich schon Events ausgewertet obwohl die Anwendung noch nicht komplett initialisiert ist.

Das entsprechende Testprogramm anbei:
ReadyToRun.zip
(129.42 KiB) 6-mal heruntergeladen
Das ist ja nur ein "einfaches" Beispiel, welches jedoch "meine" momentane Funktionalität bestätigt.
Das kann, wie schon erwähnt, in anderen komplexen Anwendugen natürlich auch ganz anders aussehen.
Mit Datenbanken hatte ich noch nichts zu tun, daher muss ich mich für diesen Bereich raushalten...
Zuletzt geändert von siro am So 16. Mai 2021, 19:30, insgesamt 2-mal geändert.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Wann ist eine Anwendung startbereit

Beitrag von af0815 »

Was meinst du damit, kannst du das näher erklären? Lässt du deine User immer selbst erst die Verbindung zur Datenbank aufbauen?
Ich erzeuge die Datamodule zur Laufzeit im OnActivate und auch dort entscheide ich, ob sich Verbindungen automatisch öffnen oder nicht. Ich schreibe sehr viel für Anwendungen ohne Keyboard und Maus. Damit ist es meistens so, das man Verbindungen automatisch öffnen muss. Da kommt immer zuerst ein Ping, ob der DB Server überhaupt erreichbar ist, dann erst wird die Connection geöffnet. Das erspart einem viel Kummer und man kann die fehlende Verbindung visualisieren damit das auch klar ist, das das die Verbindung fehlt. Dann kann man immer wieder pingen, bis die Verbindung steht. Auch zwischendurch mache ich immer wieder Pings ob da nicht was zusammengebrochen ist oder was ganz einfach abgeschalten wurde.

Timer etc. werden immer erst am Ende der Initialisierung aktiviert. Niemals automatisch, damit stelle ich sicher, das alles so mal steht wie von mir geplant. Auch Schnittstellen wie zB. Bluetooth, Serial,... kommen zu einem geplanten Zeitpunkt in der Initialisierung vor.

Das es mit OnActivate und einem Flag Probleme gibt habe ich in den vielen Jahren nicht beobachten können. Wenn es aber ein Beispiel dafür gibt, bitte her damit, damit ich es in Ruhe analysieren kann. Ich muss aber gestehen, das ich grundlegend 3 Programmglobale boolsche Variablen meistens verwende, die über die LPR initialisiert werden: Install, Uninstall und Init. Damit kann ich die Zustände nach dem Start der App kontrollieren.


@siro: Ich würde das Form2 in der Form1 erstellen lassen. In der OnCreate würde ich das ReadyToRun auf flase setzen und in der OnActivate abfragen, ist das Flag noch nicht gesetzt, so würde ich das Form2 erstellen und dann das Flag ReadyToRun auf True setzen. In den anderen Events kannst du auf das Flag abfragen und wenn nötig sofort wieder aus dem Event herausgehen, solange nicht ReadyToRun aktiv ist. Wie gesagt ist mein Stil.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Michl
Beiträge: 2424
Registriert: Di 19. Jun 2012, 12:54

Re: Wann ist eine Anwendung startbereit

Beitrag von Michl »

OK, also verbindest du auch automatisch zur DB. Wollte mich schon wundern. Danke für die Erklärung.
af0815 hat geschrieben:
So 16. Mai 2021, 19:22
Wenn es aber ein Beispiel dafür gibt, bitte her damit, damit ich es in Ruhe analysieren kann.
Mir war es mal auf die Füße gefallen, siehe oben, daher warte ich halt ein bisschen länger :wink:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten