2016-03-30 3 views
1

Je suis en train de programmer un programme d'installation qui installe un nouveau logiciel et ainsi de suite, et en plus, je veux lire des choses matérielles comme l'architecture CPU et ainsi de suite. Mais cela prend un certain temps, donc je veux afficher un écran d'accueil pendant que le programme lit le matériel. Mais ça ne s'affichera pas et je ne sais pas pourquoi.C# Splash Screen n'affiche pas

Quelqu'un peut-il m'aider, s'il vous plaît?

Dans l'en-tête du MainClass créer un nouveau Thread:

public Hauptfenster() 
     { 
      InitializeComponent(); 
      t = new Thread(new ThreadStart(ZeigeLadeBildschirm)); 
      t.Start(); 
     } 

Lorsque le Thread commence le SplashScreen doit être affiché et le matériel doit être lu par le MainClass. Ainsi, la méthode « ZeigeBildschirm » dit:

public void ZeigeLadeBildschirm() 
    { 
     SplashScreen sp = new SplashScreen(); 

     sp.Show(); 
     createFolder(); 
     entpacken(); 
     Verionszahlalsd(); 
     GetHardwareInformationRAM(); 
     GetOSInformation(); 
     GetReleaseDateBIOS(); 
     GetLastBootTime(); 
     GetHardwareInfoVideo(); 
     GetHardwareInfoMonitor(); 
     GetSystemInfo(); 
     GetCDDriveInformation(); 
     GetDiskDriveInformation(); 
     GetHardwareInfoCPU(); 
     GetInstallDateWindows(); 

    } 

pour arrêter le Mainthread alors que le nouveau Thread lit le matériel que je codé ceci après la création du Thread dans l'en-tête:

while (t.IsAlive) 
    { 
    } 

Ainsi, les regards d'en-tête comme ceci:

public Hauptfenster() 
     { 
      InitializeComponent(); 
      Initialisierung(); 
      t = new Thread(new ThreadStart(ZeigeLadeBildschirm)); 
      t.Start(); 
      while (t.IsAlive) 
      { 
      } 
      GetAdditionRAMInfo(); 
      SchreibeDaten(); 
     } 

mais quand je lance le programme, le matériel est lu mais pas SplashScreen est affiché à l'écran. Une fois le code de lecture du matériel terminé, MainForm s'ouvre et affiche toutes les données. Comment puis-je corriger ce code, de sorte que le SplashScreen sera affiché, le matériel sera lu et le SplashScreen disparaîtra et le MeinForm sera affiché?

Code de SplashScreen:

namespace The5thBlueskyInstallerSplashScreen 
{ 
    public partial class SplashScreen : Form 

    { 

     public SplashScreen() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+0

Il semble que votre while attend dans le thread principal et bloque l'interface utilisateur. –

+0

J'ai ouvert la question car le titre était intéressant, mais j'ai recherché la classe SplashScreen et elle dit: "L'écran de démarrage est affiché en utilisant du code natif, avant que l'instance de l'application WPF soit créée.". De cela, il semble que lorsque vous voulez utiliser c'est déjà trop tard. Essayez d'utiliser (au lieu de thread) la méthode .Show (bool), lisez HW, puis la méthode .Close (timeSpan) lorsque vous avez terminé. Juste deviner mais vaut la peine d'essayer. –

+0

@Mark, c'est WinForms, pas WPF, et le code (partiel) pour SplashSceen est dans la question. –

Répondre

1

Vous devez faire toute l'interface utilisateur sur le thread principal. Il suffit de décaler la création de l'écran de démarrage et l'afficher dans la classe principale, avant de créer le thread, et de le fermer à partir du thread principal, une fois le thread supplémentaire terminé.

Il serait préférable d'utiliser des événements, mais, avec ma suggestion dans les commentaires à utiliser DoEvents, un changement minime (non testé) serait:

public Hauptfenster() 
    { 
     InitializeComponent(); 
     Initialisierung(); 
     SplashScreen sp = new SplashScreen(); 
     sp.Show(); 
     t = new Thread(new ThreadStart(ZeigeLadeBildschirm)); 
     t.Start(); 
     while (t.IsAlive) 
     { 
      System.Windows.Forms.Application.DoEvents(); 
      System.Windows.Forms.Application.DoEvents(); 
      Thread.Sleep(55); 
     } 
     GetAdditionRAMInfo(); 
     SchreibeDaten(); 
     sp.Close(); 
    } 

Et enlever les références sp dans l'autre thread.

+0

si j'essaye ceci un code l'en-tête ainsi: 'InitializeComponent(); Initialisierung(); this.Masquer(); SplashScreen sp = new SplashScreen(); sp.Show(); t = nouveau Thread (nouveau ThreadStart (ZeigeLadeBildschirm)); t.Start(); tandis que (t.IsAlive) { } sp.Fermer(); GetAdditionRAMInfo(); SchreibeDaten(); 'le SplashScreen ne s'affichera jamais – The5thBluesky

+0

Oui, car vous n'autorisez aucun événement pendant que vous attendez la fin du thread. –

+0

Autrement dit, si vous ne voulez pas le faire en fonction des événements, vous devrez appeler 'System.Windows.Forms.Application.DoEvents' depuis le thread principal. –