2013-03-16 3 views
0

У меня есть заставка, которая загружается до загрузки основной формы. Случается, что экран заставки закрыт до загрузки основного экрана. Я добавил заставку, так как моему приложению требуется некоторое время, чтобы загрузить на основе лицензионного ключа поток, который я опубликовал here.Заставка закрыта до завершения основного экрана

Я действительно искал, но не уверен, как реализовать в моем коде. Я тоже встретил Фонового Работника, но снова не уверен, как действовать дальше.

Главный код:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Thread th = new Thread(new ThreadStart(ShowSplashScreen)); 
    th.Start(); 
    Thread.Sleep(5000); 
    Application.Run(new frmMain()); 
    th.Abort(); 
} 

static void ShowSplashScreen() 
{ 
    Application.Run(new frmSplashScreen()); 
} 

Splash Screen:

В виде нагрузки

timer1.Start(); 
timer1.Interval = 600; 
progressBar1.Maximum = 10; 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    if (progressBar1.Value != 10) 
    { 
     progressBar1.Value++; 
    } 
    else 
    { 
     timer1.Stop(); 
     timer1.Enabled = false; 
     this.Close(); 
    } 
} 
+0

Просто предложение, и простите меня, если это глупо, но это суббота, и я дома и просто проснулся, но ... Вы не могли бы назвать Application.Run (new frmMain()); из кода экрана Splash вместо кода Main(). Как раз перед этой.Close() строкой? – CMPerez

+0

Посмотрите на этот ответ, чтобы преодолеть свое [закрытие заставки до завершения основного процесса] (http://stackoverflow.com/questions/13206926/vb-net-progressbar-backgroundworker/13486676#13486676) –

ответ

1

Вы пройти через все усилия, чтобы начать отдельный поток для экрана-заставки, что означает, что у вас есть правильная идея. Проблема в том, что реализация немного выключена. Призыв к Thread.Sleep фактически спит текущий поток, поэтому ваш основной поток пользовательского интерфейса полностью мертв около 5 секунд, абсолютно ничего не делая, когда он должен выполнять загрузку основной формы в фоновом режиме, пока отображается экран заставки , После того, как Thread.Sleep вернется, вы вызываете Application.Run, чтобы запустить основную форму, но к тому времени уже слишком поздно - заставка уже осталась до тех пор, пока код говорит об этом, и он закрывается.

Возможно, вы устранили проблему, переместив вызов на Thread.Sleep на поток заставки, но это довольно уродливый и хакерский подход, если честно. Помимо неотъемлемых проблем со спящим потоком, реальная точка заставки (как вы сами уступаете) заключается в том, чтобы дать пользователю что-то визуально интересное и обнадеживающее, чтобы посмотреть, пока вы выполняете какую-то длительную задачу. Большинство пользователей не особенно , как заставки (хорошо, на самом деле, похоже, что большинство людей их ненавидят), но они, возможно, имеют цель, хотя и ограниченную. Когда вы используете что-то вроде Thread.Sleep, эффективно заставляя ваш заставку выходить на экран, ничего не делая, вы просто вращаете циклы процессора и теряете время пользователя без причины. Они будут намного менее прощающими. Я уверен, что это, вероятно, не ваш план, но часто это заканчивается тем, что происходит.

Было бы неплохо, если бы вы могли показать экран заставки, пока вы делаете длинную проверку в то же время в фоновом режиме? Действительно, это «правильная» реализация для экрана заставки, но очень сложно заставить его работать в самый раз. Синхронизация и кросс-потоки в коде пользовательского интерфейса сложнее писать и даже сложнее отлаживать.

Вместо этого я рекомендую вам плуть. Извлеките свой код, чтобы вручную отобразить экран заставки и все его угадывание Thread.Sleep, а вместо этого замените его встроенной рамкой заставки. Большинство людей не знают об этом, потому что хитрые программисты Microsoft спрятали его под пространством имен Microsoft.VisualBasic, где люди C# не могут его найти. Не позволяйте этому обмануть вас. Он отлично работает с приложениями C# и делает вашу жизнь намного проще. Почему эти ребята из VB.NET должны собрать все хорошие вещи для себя?

Эта структура будет обрабатывать все для вас автоматически, все, что вам нужно сделать, это предоставить ему класс формы заставки (который у вас уже есть, с именем frmSplashScreen). Вы можете найти полные инструкции по его использованию в my answer here, включая пример кода.

+0

Гэри благодарит за код , Раньше я сталкивался с этим, как вы правильно сказали, Microsoft.Visual basic отключил меня, когда я использую C#. – Adrian

+0

@gary Я попробовал код am, получив такую ​​ошибку. Форма запуска не указана – Adrian

+0

Не волнуйтесь, я получил ее на работу, ошибся в копировании и вставке :) – Adrian

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