2013-04-23 60 views
-1

我的工作中,我需要運行中的另一個 例如形式的項目,我有兩種形式類:Form 1和Form如何使用Invoke和Begin Invoke同步創建和控制另一個表單?

在Form1:

public void func1() 
{ 
    form2 f=new form2(); 
    f.show(); 
    Thread.sleep(2000); 
} 

當我運行此, f這是form2的一個實例掛起,直到線程在2秒後喚醒。

我試過使用另一個線程,但它不工作正確。我知道我應該使用InvokeBeginInvoke(),但我不知道如何在這裏使用它們。我是新來的委託和調用,我越讀越多,我感到困惑!請幫幫我。

EDIT1(更多信息) Form1的是主表和窗口2是一個簡單的形式與按鈕 在Form1我創建並顯示療法窗口2,如下:

public partial class Form1 : Form 
    { 

     public delegate void showdel(); 
     public Form2 f; 
     public Form1() 
     { 
      InitializeComponent(); 
      f = new Form2(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Thread t = new Thread(sstart); 
      t.Start(); 
      Thread.Sleep(3000); 
     } 


     public void sstart() 
     { 
      f.Show(); 
     } 

    } 

但是當我運行這個代碼form2出現一會兒,然後迅速消失。即使當我嘗試此代碼sstart()它的工作原理是相同的:

public void sstart() 
     { 
      if (f.InvokeRequired == true) 

       f.BeginInvoke(new showdel(sstart)); 

      else 
       f.Show(); 
     } 

我有懸掛問題呢。但進一步我想控制form1中的form2,例如更改表格2的標題。不幸的是,我沒有太多關於backgroundworker的信息以及它如何工作? 沒有人有任何參考嗎?

+2

不要在UI線程中執行阻塞任務。你想達到什麼目的? – SLaks 2013-04-23 15:03:39

+2

如果Form2應該是主動控制表單,則使用'ShowDialog'而不是'Show'。否則,你應該使用BackgroundWorker和Wait命令。您需要更加具體地瞭解Form2應該如何使用。 – Nevyn 2013-04-23 15:05:22

+0

它會掛起兩秒鐘,因爲您正在讓主線程休眠兩秒鐘。這應該是密集操作的佔位符嗎?你說過你嘗試過使用另一個線程,但「它沒有工作」 - 它是如何工作的?你有沒有例外?展示給我們。向我們展示「無法使用」的代碼。解釋你期望它做什麼。 – 2013-04-23 15:07:34

回答

0

如果你只是想讓form2啓動並且只出現兩秒鐘,我會向構造函數添加一個計時器來關閉它。

public Form2() 
    { 
     InitializeComponent(); 
     System.Windows.Forms.Timer Timer = new Timer(); 
     Timer.Interval = 2000; 
     Timer.Enabled = true; 
     Timer.Tick += new EventHandler(Timer_Tick); 

    } 
    private void Timer_Tick(object o, EventArgs a) 
    { 

      this.Close(); 
    } 

可能是稍微好一點的方法來做到這一點(Backgroundworker等)。

+0

謝謝,但thread.sleep()是一個示例。在真正的程序中,我有一個連接到設備需要大約3秒,我想我應該使用backgroundworker,但我不知道從哪裏開始?我的意思是一個教程或參考... – 2013-04-23 16:20:58

+0

我的建議:A)首先將Form 2的標識符聲明爲全局的,並像你一樣實例化它。 B)僅僅因爲你開始另一種形式並不意味着它在一個單獨的線程中。只要你在同一個線程中,你就可以從任何地方改變任何東西。(Form2的變量).Title =「New Title」; 這可能有所幫助:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28EHINVALIDOPERATION.WINFORMS.ILLEGALCROSSTHREADCALL%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION% 3dV4.0%22%29; K-%28DevLang-CSHARP%29&RD =真 – 2013-04-24 02:12:20