2011-10-11 18 views
2

我希望在执行功能时创建加载屏幕 - 就像在游戏,新窗口或某些图形中加载屏幕一样。如何使执行功能期间的应用程序加载屏幕

所以我按下按钮“开始” - 应用程序启动做一些东西,childform窗口显示图形 - “进展中的功能,请稍候”

怎么办呢?

+2

看看在['BackgroundWorker'(HTTP:// msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)控件。 –

回答

6

您可以依次在一个单独的线程来执行你的功能使用BackgroundWorkerBackgroundWorker有很多功能支持您正在寻找的功能。如果你没有使用另一个线程来执行你的函数,那么主线程(UI线程)将会很忙,并且子窗口将无法正常工作。

backgroundWorker的一些关键注意事项。在另一个线程中进行DoWork,向主线程报告进度并取消异步进程是BackgroundWorker中最重要的功能。下面的例子很清楚地展示了这三个功能。但它显示了任务完成的实际百分比。如果您只想显示一条消息并使用Marquee style显示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 + "%"); 
    } 
} 

Reference

3

游戏做这件事的方式是他们做两个不同的应用程序。这不是一个真正的加载屏幕,而是更多的启动器,检查更新,显示新闻并启动游戏。第二个应用是它自己的游戏。如果你这样做在C#中的发射器可以通过调用启动游戏:

System.Diagnostics.Process.Start("[APPLICATION_PATH]"); 
+1

它只是用于一些加载屏幕而不常用。第二个可执行文件更可能受DRM保护和/或加密,所以第一个可执行文件更像加载/解密程序。对于某些游戏,它可能会检查真实游戏的先决条件(类似于安装程序的不同引导程序)加载器可以用本地C++编写,确保安装游戏的所有依赖关系(例如.net Framework或DirectX)。 – Mario

2

这是非常简单的。您需要通过ShowDialog而不是Show来显示此表单。并且在调用Hide之后的另一个线程中执行'some stuff'。这是第一个来我的脑海:

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的方式来做到这一点...)

相关问题