2016-11-10 4 views
1

Итак, у меня есть заставку, у которой будет некоторый временной код, и я не хочу, чтобы он работал в основном потоке. Я сделал некоторый код, который должен остановить поток и закрыть форму, но это не сработает. Любая помощь приветствуется.Заставка экрана заставки

Код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 

namespace Cobalt 
{ 
    partial class Cobalt : Form 
    { 
     public static bool splashCont { get; set; } 

     public Cobalt() 
     { 
      this.Text = "Cobalt V1.0.0"; 
      this.Width = 400; 
      this.Height = 100; 
      this.BackgroundImage = Properties.Resources.cobaltlgo; 
      this.FormBorderStyle = FormBorderStyle.None; 
      this.TopMost = true; 
      this.StartPosition = FormStartPosition.CenterScreen; 

      Thread splash = new Thread(new ThreadStart(splashLoadAction)); 
      splash.Start(); 

      if (splashCont) 
      { 
       splash.Abort(); 

       this.Close(); 
      } 
     } 

     private void splashLoadAction() 
     { 
      Thread.Sleep(5000); 
      Cobalt.splashCont = true; 
     } 
    } 
} 

Программа просто остается на этом экране: Screen EDIT: я был в состоянии исправить это с помощью следующего кода:

Invoke((MethodInvoker)delegate { MyNextForm.Show(); }); 

, активизирующим MyNextForm.Show() в потоке пользовательского интерфейса.

+0

Что означает «не работает»? – Enigmativity

+1

Кроме того, если вы когда-либо называете 'Thread.Abort()', то вы делаете что-то ** очень неправильно **, если только вы не пытаетесь принудительно закрыть все ваше приложение. – Enigmativity

ответ

-1

Как вы уже Thread.Sleep в резьбе, основной поток продолжит выполнение так код

if (splashCont) 
{ 
    splash.Abort(); 

    this.Close(); 
} 

будет выполняться задолго до того, вы можете установить splashCnt = верно.

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

, если вы действительно хотите нить спать, чем вы могли бы сделать основной поток ждать на суб-нить завершить

while (splash.IsAlive) 
{ 
    Thread.Sleep(1000); 
} 

if (splashCont) 
{ 
    splash.Abort(); 
    this.Close(); 
} 
+0

Но тогда главный поток остановлен и графический интерфейс не отображается – steve

+0

Если вы не хотите помещать Thread.Sleep в средний поток, вам может потребоваться взять Thread.Sleep из метода, который вызывается из потока также. – Mallappa

0

Если вы хотите работу, выполняемую в виде заставки, вы можете упростить этот сильно. Это предполагает, что ваш пятисекундный сон имитирует работу по запуску. Таким образом, форма брызга просто закроется, когда будет запущена работа по запуску.

partial class Cobalt : Form 
{ 
    public Cobalt() 
    { 
     this.Text = "Cobalt V1.0.0"; 
     this.Width = 400; 
     this.Height = 100; 
     this.BackgroundImage = Properties.Resources.cobaltlgo; 
     this.FormBorderStyle = FormBorderStyle.None; 
     this.TopMost = true; 
     this.StartPosition = FormStartPosition.CenterScreen; 
     this.Show(); 
     splashLoadAction(); 
     this.Close(); 
    } 

    private void splashLoadAction() 
    { 
     Thread.Sleep(5000); 
    } 
} 
0

Вы должны поместить таймер в свою форму заставки и закрыть его по прошествии времени. Вероятно, вы захотите изменить точку входа в приложение, чтобы эта форма отображалась перед началом основной формы заявки.

Ну, в реальной жизни это может быть более сложным, чем это, если вы хотите, например, сохранить всплеск, отображаемый дольше, если приложение не готово или пока не отобразится основная форма.

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

Использование событий таймера, простоя и видимости, вы можете делать все, что хотите, как хотите, как только вы поймете, как все работает.

+0

Хорошие идеи. Я буду рассматривать их – steve

 Смежные вопросы

  • Нет связанных вопросов^_^