2012-01-20 66 views
0

要去我在Visual Studio 2008中框架3.5, 我需要其中一個方法是在窗口,在該窗口中的其他形式的出現與去併發等待窗口一個Windows應用程序一些運動圖像(動畫)就像一個.gif圖像。如何顯示一個形式,而過程是目前的形式

我有2個窗體,在form2上,按鈕單擊我執行冗長的過程, 我希望我的'frmWait'出現在屏幕上,同時form2上的過程正在進行並在完成時消失。當我的'frmWait'出現時,表單2不應該被用戶訪問。

我的代碼在這裏。 Form 2

在SomeWork過程中有一個for循環我寫了,但實際上在程序中是數據庫命令在sqlserver中執行,當查詢在服務器上執行時,我的主程序工作停止,直到服務器完成工作,之後程序獲得執​​行指針,同時,軟件似乎是掛起的。

namespace WindowsFormsApplication1 
    { 
     public partial class Form2 : Form 
     { 
      public Form2() 
      { 
       InitializeComponent(); 
      } 

      private void button1_Click(object sender, EventArgs e) 
      { 
       frmWait fw = new frmWait("Wait...",0); 
       fw.Show(); 

       SomeWork(); 

       fw.Close(); 
      } 

      private void SomeWork() 
      { 
       for (int x = 0; x < 99999999; x++) 
       { } 
      } 
     } 
    } 
+0

thnx all to reply。但這裏有一些更多的規範需要,在進程SomeWork和窗體Form2我沒有訪問權限,我有權訪問frmwait,這種形式將是一個普遍化的形式,任何人需要等待,而漫長的過程將調用frmwait在15程序員。 –

+0

我想爲此編寫一個簡單的解決方案,使用frmwait的程序員,他必須在工作之前顯示frmWait並在工作之後關閉它。一些工作過程應該在主線程中,直到某些未完成的用戶不能在應用程序中執行進一步的任務。 –

+0

首先,你應該編輯你的問題,而不是添加評論。第二:目前還不清楚。你的意思是你不能修改'button1_Click'中的代碼?那麼你想如何解決這個問題? –

回答

3

您應該在後臺線程中執行冗長的過程。這可以通過使用BackgroundWorker輕鬆實現。

一旦工人開始,只是用frmWait.ShowDialog()顯示frmWait。

當工作人員通知作業結束,關閉frmWait例如使用frmWait.DialogResult=Cancel

你可以採取ProgressChanged事件的優勢,在你frmWait報告進度。

如果用戶點擊frmWait取消按鈕,只需撥打CancelAsync()你的後臺工作。

Full sample here

+0

當我使用後臺工作人員表單2會令人期待的更多操作給用戶 –

+0

沒有,因爲frmWait是模式:'frmWait.ShowDialog()' –

+0

它不工作執行暫停frmWait.ShowDialog() frmwait關閉。 –

-1

您可以使用模式對話框。因爲它不會允許與其他形式(即窗口2)交互

frmWait.ShowDialog(); 

也嘗試使用化背景工人background worker,這使得更容易做背景proceses。

+1

這將不會'工作,ShowDialog將阻止,直到它被駁回 – Jason

+0

當我使用showdialog執行中斷,直到frmwait沒有關閉。但我想在處理過程中顯示錶單。 –

+0

已更新ans ..檢查.. –

0

你應該使用BackgroundWorker在這種情況下,從主UI線程移開SomeWork部分

SomeWork();部分移動到BackgroundWorker單獨DoWork方法。這樣SomeWork將由BackgroundWorker在單獨的後臺線程中執行。然後在Background Work Completed事件,這將提高一次SomeWork是完全不fw.Close();

-1

我不明白你的意思究竟是什麼,但如果你想直到frmWait是開放的,你的窗體2切不可用戶訪問,使用frmWait。 ShowDialog的(),如果你希望在一個特定的處理結束時,在frmWait,收frmWait使用以下

Process.WaitForExit(); 
this.Close(); 
+0

請說明簡要 –

+0

這將要求您的長時間運行過程是一個單獨的可執行文件,您的對話框將在命令提示符下啓動。我不認爲這是你要找的。 – Jason

2

先加..

using System.Threading; 

我已經適應你的代碼上述使用一個單獨的線程..

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SomeWork();    
} 

Thread t; 

private void SomeWork() 
{ 
    frmWait fw = new frmWait("Wait...", 0); 

    this.t = new Thread((ThreadStart)delegate() 
    { 

     for (int x = 0; x < 99999; x++) 
     { 
      Thread.Sleep(100); 

      //Debug.WriteLine(x); 
     } 


     if (this != null && !this.IsDisposed) this.BeginInvoke((ThreadStart)delegate() { fw.Close(); }); 
    }); 

    this.t.Start(); 

    fw.ShowDialog(this); 
} 

也如果用戶被允許在完成之前關閉Form2,可能需要處理FormClosing事件來終止該線程!

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (t != null && t.IsAlive) t.Abort(); 
} 
+0

什麼是「fw」,請您簡單介紹一下,我來自不同的文化,所以我有一些問題要理解語言! –

+0

我直接從你的代碼中拿走它! – banging

+0

而不是fw.Show();嘗試fw.Show(this); – banging