2012-03-15 60 views
0

當我的應用程序加載時,阻止其他控件的c#表單。我使用下面的代碼顯示一個進度條。問題是如果有人點擊工具欄上下文菜單(退出的方式),它將被阻止,直到進度條關閉。有沒有人知道實現這一目標的更好方法?當顯示對話框叫做

我使用ShowDialog的原因是,當我用Show進度條就不動畫 - 我使用的MarqueeStyle。

感謝

public partial class PopUpProgessBar : Form 
{ 
    public PopUpProgessBar() 
    { 
     InitializeComponent(); 
    } 

    Thread t; 
    private void StartAnmiation() 
    { 
     this.Update(); 
     this.ShowDialog(); 
    } 

    public void Stop() 
    { 
     if (t != null) 
     { 
      t.Abort(); 
      t.Join(); 
     } 
    } 

    public void Start() 
    { 
     if (t == null) 
     { 
      t = new Thread(new ThreadStart(this.StartAnmiation)); 
      t.Start(); 
     } 
    } 
+0

它不會被阻止,直到進度條停止,它被阻止,直到您的應用程序加載完畢,並開始爲響應命令。相當不可避免。需要一段時間讓F5在VS中工作。這種代碼非常危險,請確保您的應用程序在您按Windows + L鍵時不會死鎖。 – 2012-03-15 18:29:34

回答

2

此代碼看起來不完全正確。你確定它不會拋出跨線程違規嗎?一般來說,你的整個比喻是錯誤的。您需要將GUI保留在GUI線程中。在後臺線程上加載你的應用程序並讓它向GUI線程發送進度更新。

+0

是的 - 好點,更好的方式來設計它。 – 2012-03-15 18:25:37

1

你的PopupProgressBar表單不應該負責在一個新的線程中加載自己,這應該在你的主窗口中完成。

我會擺脫PopupProgressBar中所有線程的東西,並使其開始更新它的選取框。然後,在你的主窗口(onLoad)實現,你告訴它做的事情:

 bool done = false; 
     PopupProgressBar splashForm = null; 
     ThreadPool.QueueUserWorkItem((x) => 
     { 
      using (splashForm = new PopupProgressBar()) 
      { 
       splashForm.Show(); 
       while (!done) 
        Application.DoEvents(); 
       splashForm.Close(); 
      } 
     }); 

     // do all your initialization work here 
     // also, during each step of your initialization you could send call a function 
     // in splashForm to update 

     done = true; 
+0

謝謝,非常有幫助的答案。 – 2012-03-15 19:02:59