Anzeigen Programm wird geladen.
-
- 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.
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ß
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ß
-
- 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.
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);
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Anzeigen Programm wird geladen.
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
-
- 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.
Muss man das machen?Warf hat geschrieben:Die Funktionen des Ladens (Versionsabfrage etc.) in einen anderen Thread auslagern. Dazu hier mehr: http://wiki.freepascal.org/Multithreade ... utorial/de
Was ist Das, Splashscreen?Warf hat geschrieben:Einfach einen Splashscreen erzeugen,
Das sieht sehr Kompliziert aus.
-
- 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.
hbr hat geschrieben:Muss man das machen?Warf hat geschrieben:Die Funktionen des Ladens (Versionsabfrage etc.) in einen anderen Thread auslagern. Dazu hier mehr: http://wiki.freepascal.org/Multithreade ... utorial/deWas ist Das, Splashscreen?Warf hat geschrieben:Einfach einen Splashscreen erzeugen,
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);
-
- 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.
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
Mit Java und C/C++ sehe ich rot
-
- 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.
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?
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Anzeigen Programm wird geladen.
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
-
- 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.
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..
Eben, der Splashscreen ist einfacher.compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
-
- 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.
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
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1910
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Anzeigen Programm wird geladen.
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..Eben, der Splashscreen ist einfacher.compmgmt hat geschrieben:Und es ist einfacher als einen extra Thread zu erzeugen.
Manchmal bin ich zu dumm zum lesen
Das kommt davon wenn man zu viel C an einem Tag programmiert, man wird Dumm
-
- 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.
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>"
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>"