2016-03-30 2 views
1

Я программирую установщика, который устанавливает новое программное обеспечение и так далее, и, кроме того, я хочу прочитать некоторые аппаратные средства, такие как архитектура процессора и т. Д. Но это занимает некоторое время, поэтому я хочу отображать заставку, пока программа читает аппаратное обеспечение. Но он не будет отображаться, и я не знаю, почему.C# Splash Screen не отображается

Может кто-нибудь мне помочь, пожалуйста?

В заголовке части MainClass создать новый Thread:

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

Когда Thread начинается SplashScreen должны быть отображены и аппаратные средства должны быть считаны MainClass. Таким образом, метод «ZeigeBildschirm» говорит:

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

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

    } 

остановить Mainthread в то время как новый Thread считывает аппаратные я кодированное это после создания Thread в заголовке:

while (t.IsAlive) 
    { 
    } 

Так что Header внешность как это:

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

но когда я начинаю программу, аппаратные средства считывается, но не SplashScreen не отображается на экране. После завершения кода аппаратного считывания MainForm открывает и отображает все данные. Как я могу исправить этот код, так что будет отображаться SplashScreen, аппаратное обеспечение будет считано и SplashScreen исчезнет, ​​и появится MeinForm?

Кодекс SplashScreen:

namespace The5thBlueskyInstallerSplashScreen 
{ 
    public partial class SplashScreen : Form 

    { 

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

Кажется, что ваш 'while' ждет в основном потоке и блокирует пользовательский интерфейс. –

+0

Я открыл вопрос, поскольку название было интересным, но просмотрел класс SplashScreen, и он говорит: «Экран заставки отображается с использованием собственного кода, прежде чем будет создан экземпляр приложения WPF». Из этого кажется, что вы хотите использовать слишком поздно. Попробуйте использовать (вместо потоковой передачи) метод .Show (bool), прочитайте HW, затем метод .Close (timeSpan), когда вы закончите. Просто гадать, но стоит попробовать. –

+0

@Mark, это WinForms, а не WPF, и (частичный) код для SplashSceen находится в вопросе. –

ответ

1

Вы должны сделать все UI в главном потоке.

Просто смените создание заставки и покажите основному классу, прежде чем создавать поток, и закройте его из основного потока после завершения дополнительного потока.

Было бы предпочтительнее использовать событие, но, с моим предложением в комментариях использовать DoEvents, минимальное (непроверенное) изменение будет:

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(); 
    } 

И удалить sp ссылки в другом потоке.

+0

если я попробую этот код заголовок так: 'InitializeComponent(); Initialisierung(); это.Скрыть(); SplashScreen sp = new SplashScreen(); sp.Show(); t = новая тема (новый ThreadStart (ZeigeLadeBildschirm)); t.Start(); while (t.IsAlive) { } sp.Close(); GetAdditionRAMInfo(); SchreibeDaten(); 'SplashScreen никогда не будет отображаться – The5thBluesky

+0

Да, потому что вы не разрешаете ничего, пока вы ждете окончания потока. –

+0

То есть, если вы не хотите делать это на основе событий, вам нужно просто вызвать 'System.Windows.Forms.Application.DoEvents' из основного потока. –