Как сделать экран загрузки приложения во время выполнения функции - PullRequest
2 голосов
/ 11 октября 2011

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

Итак, я нажимаю кнопку «Пуск» - приложение начинает делать какие-то вещи, и в окне дочерней формы отображается графическое изображение - «Выполняется функция, подождите, пожалуйста»

Как это сделать?

Ответы [ 3 ]

6 голосов
/ 11 октября 2011

Вы можете использовать BackgroundWorker для выполнения ваших функций в отдельном потоке. BackgroundWorker имеет множество функций для поддержки функций, которые вы ищете. Если вы не использовали другой поток для выполнения своей функции, основной поток (поток пользовательского интерфейса) будет занят, а дочернее окно не будет работать должным образом.

Некоторые ключевые замечания по backgroundWorker. DoWork в другом потоке, отчет о проделанной работе в основной поток и отмена асинхронного процесса - самые важные функции в BackgroundWorker. Приведенный ниже пример демонстрирует эти три функции довольно четко. Но он отображает фактический процент выполнения задачи. Если вы просто хотите показать сообщение и ProgressBar с Стиль выделения , вам не нужно включать флаг WorkerReportsProgress и не нужно ProgressChanged реализация события.

В Интернете доступно множество примеров.

using System;
using System.Threading;
using System.ComponentModel;

class Program
{
  static BackgroundWorker _bw;

  static void Main()
  {
    _bw = new BackgroundWorker
    {
      WorkerReportsProgress = true,
      WorkerSupportsCancellation = true
    };
    _bw.DoWork += bw_DoWork;
    _bw.ProgressChanged += bw_ProgressChanged;
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted;

    _bw.RunWorkerAsync ("Hello to worker");

    Console.WriteLine ("Press Enter in the next 5 seconds to cancel");
    Console.ReadLine();
    if (_bw.IsBusy) _bw.CancelAsync();
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    for (int i = 0; i <= 100; i += 20)
    {
      if (_bw.CancellationPending) { e.Cancel = true; return; }
      _bw.ReportProgress (i);
      Thread.Sleep (1000);      // Just for the demo... don't go sleeping
    }                           // for real in pooled threads!

    e.Result = 123;    // This gets passed to RunWorkerCompleted
  }

  static void bw_RunWorkerCompleted (object sender,
                                     RunWorkerCompletedEventArgs e)
  {
    if (e.Cancelled)
      Console.WriteLine ("You canceled!");
    else if (e.Error != null)
      Console.WriteLine ("Worker exception: " + e.Error.ToString());
    else
      Console.WriteLine ("Complete: " + e.Result);      // from DoWork
  }

  static void bw_ProgressChanged (object sender,
                                  ProgressChangedEventArgs e)
  {
    Console.WriteLine ("Reached " + e.ProgressPercentage + "%");
  }
}

Ссылка

3 голосов
/ 11 октября 2011

То, как игры делают это, они делают два разных приложения.На самом деле это не экран загрузки, а скорее лаунчер, который проверяет обновления, показывает новости и запускает игру.Второе приложение - игра сама.Если вы сделаете это в C #, программа запуска может запустить игру по телефону:

System.Diagnostics.Process.Start("[APPLICATION_PATH]");
2 голосов
/ 11 октября 2011

Это очень просто. Вам нужно отобразить эту форму с помощью ShowDialog вместо Show. И выполнить «некоторые вещи» в другом потоке, который после вызова Hide. Это первое, что приходит мне в голову:

void DoSomeStuff ()
{
  //Showing splash screen
  SplashForm.ShowDialog(this);
  new Thread (()=>
  {
    //do stuff what you need
    //Hiding splash screen
    SplashForm.Invoke (new Action (SplashForm.Hide));
  }).Start();
}

Кстати, есть более 9000 способов сделать это ...)

...