Anzeigen Programm wird geladen.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Anzeigen Programm wird geladen.

Beitrag von hbr »

Hallo Forum,
Ein Programm wird geladen, viele Funktionen(Internet Versionsabfrage usw.) werden in FormCreate abgearbeitet was unter Umständen lange dauert bis die Form sichtbar wird.
Es dreht sich unter Windows keine Eieruhr die mir anzeigt dass das Programm geladen wird.
Wie kann ich nun eine Anzeige Realisieren, die mir das Laden des Programms anzeigt?
Dieser Funktionsaufruf müsste in der FormCreate an erste Stelle stehen.
Ich habe schon Versucht zuerst eine Andere Form auf zurufen, die dann die Hauptform aufruft.
Leider erscheinen beide Formen gleichzeitig.
Wie könnte ich das Realisieren?

Für Antworten wäre ich dankbar.

Gruß

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Anzeigen Programm wird geladen.

Beitrag von compmgmt »

Die Funktionen des Ladens (Versionsabfrage etc.) in einen anderen Thread auslagern. Dazu hier mehr: http://wiki.freepascal.org/Multithreade ... utorial/de

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Anzeigen Programm wird geladen.

Beitrag von Warf »

compmgmt hat geschrieben:Die Funktionen des Ladens (Versionsabfrage etc.) in einen anderen Thread auslagern. Dazu hier mehr: http://wiki.freepascal.org/Multithreade ... utorial/de


Viel zu kompliziert. Einfach einen Splashscreen erzeugen, ein Formular erstellen auf dem irgendwas zu sehen ist. Dann in deinem Hauptformular eine neue Methode hinzufügen die einen Parameter des Typs IntPtr entgegen nimmt, und dort zunächst dein Main Formular Unsichtbar machen (Hide) und deinen Splashscreen sichtbar machen (dann noch ein ProcessMessages dazu). Danach dort den Ladevorgang implementieren, und am ende den Splashscreen schließen und das Hauptvormular sichtbar machen. In der OnCreate einfach dann

Code: Alles auswählen

  Application.ShowMainForm := False;
  Application.QueueAsyncCall(@ShowStartupScreen, 0);

einfügen (ShowStartupScreen natürlich mit dem Namen deiner Methode ersetzen).

Beispiel aus einem meiner Projekte (auch wenn es nicht ganz das selbe ist):
Link und Link

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Anzeigen Programm wird geladen.

Beitrag von hbr »

Warf hat geschrieben:Die Funktionen des Ladens (Versionsabfrage etc.) in einen anderen Thread auslagern. Dazu hier mehr: http://wiki.freepascal.org/Multithreade ... utorial/de
Muss man das machen?


Warf hat geschrieben:Einfach einen Splashscreen erzeugen,
Was ist Das, Splashscreen?

Das sieht sehr Kompliziert aus.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Anzeigen Programm wird geladen.

Beitrag von compmgmt »

hbr hat geschrieben:
Warf hat geschrieben:Die Funktionen des Ladens (Versionsabfrage etc.) in einen anderen Thread auslagern. Dazu hier mehr: http://wiki.freepascal.org/Multithreade ... utorial/de
Muss man das machen?


Warf hat geschrieben:Einfach einen Splashscreen erzeugen,
Was ist Das, Splashscreen?

Das sieht sehr Kompliziert aus.

Das mit dem extra Thread ist optional.

Wenn du Lazarus startest, kommt doch jedes mal ein kleiner rechteckiger Bildschirm, auf dem der Leopard zu sehen ist + Lazarus-Version und danach kommt erst die eigentliche IDE. Dieses kleine Fenster ist ein Splashscreen. Und es ist einfacher als einen extra Thread zu erzeugen.

EDIT: Rechteckiges Fenster, nicht Rechteckiger Bildschirm
Zuletzt geändert von compmgmt am Mo 28. Nov 2016, 18:13, insgesamt 1-mal geändert.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Anzeigen Programm wird geladen.

Beitrag von Mathias »

Was ist Das, Splashscreen?

ZB. das blauen Fenster das man kurz sieht, wen mal Lazarus startet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Anzeigen Programm wird geladen.

Beitrag von hbr »

Mathias hat geschrieben:
Was ist Das, Splashscreen?

ZB. das blauen Fenster das man kurz sieht, wen mal Lazarus startet.


Es ist also kein Formular, Anwendung, Frame?

Wie Erzeugt man ein Splashscreen und wo?

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Anzeigen Programm wird geladen.

Beitrag von Warf »

compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.


Warum sollte es einfacher sein eine Thread Klasse zu erstellen, und sich mit allen Problemen von Multithreading auseinander zu setzen statt einfach es single Threaded zu machen wie ich es vorgeschlagen habe? Ich meine wenn er es multithreded implementieren würde, würde der Main Thread letzendlich auch nur idlen und somit unnötig Rechenzeit für reine warten beanspruchen. Noch dazu kommt dass für Threading man eine eigne Klasse schreiben muss während für die single thread Lösung nur eine Methode benötigt wird. Außerdem ist Multithreading in keinster weise einfach für einsteiger. Man muss wissen wie sich Thread Stacks verhalten, wie man mit Sperren arbeitet, wie man Deadlocks vermeidet, wie man am besten Synchronisiert, etc..

Also Single threaded ist 1. performanter, 2. Kürzer (und einfacher) und 3. benötigt deutlich weniger Fachwissen 4. Das Resultat ist nicht schlechter. Warum genau ist Multithreading dann besser?

hbr hat geschrieben:
Mathias hat geschrieben:
Was ist Das, Splashscreen?

ZB. das blauen Fenster das man kurz sieht, wen mal Lazarus startet.


Es ist also kein Formular, Anwendung, Frame?

Wie Erzeugt man ein Splashscreen und wo?

Schlicht weg ein Formular mit Position Screen Center und Borderstyle none

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Anzeigen Programm wird geladen.

Beitrag von compmgmt »

Warf hat geschrieben:
compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.


Warum sollte es einfacher sein eine Thread Klasse zu erstellen, und sich mit allen Problemen von Multithreading auseinander zu setzen statt einfach es single Threaded zu machen wie ich es vorgeschlagen habe? Ich meine wenn er es multithreded implementieren würde, würde der Main Thread letzendlich auch nur idlen und somit unnötig Rechenzeit für reine warten beanspruchen. Noch dazu kommt dass für Threading man eine eigne Klasse schreiben muss während für die single thread Lösung nur eine Methode benötigt wird. Außerdem ist Multithreading in keinster weise einfach für einsteiger. Man muss wissen wie sich Thread Stacks verhalten, wie man mit Sperren arbeitet, wie man Deadlocks vermeidet, wie man am besten Synchronisiert, etc..

compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.
Eben, der Splashscreen ist einfacher.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Anzeigen Programm wird geladen.

Beitrag von Mathias »

Wie Erzeugt man ein Splashscreen und wo?

ZB. so:

Code: Alles auswählen

var
  F: TForm;
 
begin
  F := TForm.Create(nil);
  F.Show;
 
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Sleep(3000); // nur für Test
  F.Close;
  F.Free;
  Application.Run;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Anzeigen Programm wird geladen.

Beitrag von Warf »

compmgmt hat geschrieben:
Warf hat geschrieben:
compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.


Warum sollte es einfacher sein eine Thread Klasse zu erstellen, und sich mit allen Problemen von Multithreading auseinander zu setzen statt einfach es single Threaded zu machen wie ich es vorgeschlagen habe? Ich meine wenn er es multithreded implementieren würde, würde der Main Thread letzendlich auch nur idlen und somit unnötig Rechenzeit für reine warten beanspruchen. Noch dazu kommt dass für Threading man eine eigne Klasse schreiben muss während für die single thread Lösung nur eine Methode benötigt wird. Außerdem ist Multithreading in keinster weise einfach für einsteiger. Man muss wissen wie sich Thread Stacks verhalten, wie man mit Sperren arbeitet, wie man Deadlocks vermeidet, wie man am besten Synchronisiert, etc..

compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.
Eben, der Splashscreen ist einfacher.


Manchmal bin ich zu dumm zum lesen :mrgreen:
Das kommt davon wenn man zu viel C an einem Tag programmiert, man wird Dumm :D

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Anzeigen Programm wird geladen.

Beitrag von hbr »

Irgendwie funktioniert es nicht,

Application.QueueAsyncCall(@ShowMeineForm, 0);

Gibt Fehlermeldung:
FrmMain.pas(2410,43) Error: Incompatible type for arg no. 1: Got "Pointer", expected "<procedure variable type of procedure(LongInt) of object;Register>"

Antworten