Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Threaded Splash-Screen (https://www.delphipraxis.net/205171-threaded-splash-screen.html)

lowmax_5 8. Aug 2020 16:14

Threaded Splash-Screen
 
Hi,
es gab schon diverse Diskussionen zum Thema z.B. https://www.delphipraxis.net/184844-...ashscreen.html. Sowie https://www.delphipraxis.net/165336-...ashscreen.html mit separater Auslagerung als dll. Dieses trifft jedoch nicht exakt das, was ich benötige.

Ich möchte eine animierte Splash (Animation starten - z.B. Video oder Bilderserie anzeigen).
Dann soll ein Codeteil im Hauptthread ausgeführt werden, der unbekannt lange dauern kann. Nach dem Beenden des Hauptthreads soll der Splash dann beendet werden.

Da es Interaktion mit der VCL gibt und kein Zugriff darauf besteht bzw. dieser nicht Threadsave ist, kann der Hauptthread nicht in einen separaten Thread ausgelagert werden. Vielmehr sollte der Splash-Screen im Thread laufen, so dass die Animation während der Wartezeit läuft.

Code:
   StartSplashScreenThread;
  try
    Sleep(10000); // Nicht ThreadSave
  finally
    StopSplashScreenThread;
  end;
Ist das grundsätzlich möglich oder mache ich hier einen Gedankenfehler?

Bernhard Geyer 8. Aug 2020 17:41

AW: Threaded Splash-Screen
 
Geht nicht.
Alles was mit der GUI zu tun hat muss (in der VCL) im Hauptthread erfolgen (bzw. in dem Thread in dem das Windows-GUI-Control erstellt wurde).
Da es schwierig wird eine Formular im Thread zu erstellen und dann *irgendwie* zu verhindern das es globale Objekte (TApplication, ...) zugreift, welche auch Windows-GDI-Ressourcen nutzen wir das fast unmöglich sein zu tun.
Ein DLL hilft dir nur wenn du das laden auch in einem Thread verlagern kannst und damit das dortige Application-Instanz auch im anderen Thread erzeugt wird.

himitsu 8. Aug 2020 21:09

AW: Threaded Splash-Screen
 
Wie dort schon erwähnt, kann man NonVCL eine Form in jedem beliebigen Thread erstellen (CreateWindow/CreateDialog) und die kann während der MainThread hängt unabhängig arbeiten.

Bei uns wurde zuletzt im Haupthtread von einer Wait-TForm ein ScreenShot gemacht (intern mit Form.Print) und dieses Bitmap dann auf der NonVCL-Form angezeigt.


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