2010-04-14 99 views
0

我正在使用基於DirectX的模擬器。 我必須檢查設備是否已插入設備或從PC中取出設備。在C#中如何根據另一個線程中的類來顯示來自另一個GUI的GUI?

我已經設法在另一個線程上設備到達和移除的類,這會在設備到達或移除時從線程本身引發事件。 正在調用相應的事件方法的主窗體中:

假設Form1是主窗口,Form2是輔助窗口。

Form2 form2Instance = new Form2(); 

我想表明另一種形式(Form2)由

在保持主窗口(Form1)的後面(相同的,因爲它表現爲在一般情況下form2Instance.ShowDialog();) 試了幾次我都做到了之後Applicatin.Run(new Form2());,但Form2不以任何方式表現爲'form2Instance.ShowDialog();

只是給的代碼,如果它可以在回答幫助:

iARMdetectionThreadClass detection; 
InProgram_iARMdetection iARMStatusGUI; 

private void Form2_Load(object sender, EventArgs e) 
     { 
     iARMStatusGUI = new InProgram_iARMdetection(); 
     detection = new iARMdetectionThreadClass(); 
     detection.IniARM_device_Arrive += new iARMdetectionThreadClass.iARM_device_ArrivedEventHandler(detection_IniARM_device_Arrive); 
     detection.IniARM_device_Remove += new iARMdetectionThreadClass.iARM_device_RemovedEventHandler(detection_IniARM_device_Remove); 
     detection.startThread(); 
     } 


void detection_IniARM_device_Remove(iARM_deviceInfo senderInfo) 
     { 

      detection.StopCheckBeingRemoved(); 
      MethodInvoker act = delegate 
      { 
       this.label_iARMStatus.Text = detection.iARM_deviceInf.iARMStatus; 
      }; 
      this.label_iARMStatus.BeginInvoke(act); 

      Application.Run(new InProgram_iARMdetection()); //Blocking code 

      detection.StartCheckBeingRemoved(); 

     } 

void detection_IniARM_device_Arrive(iARM_deviceInfo senderInfo) 
     { 
      MethodInvoker act = delegate 
      { 
       this.label_iARMStatus.Text = detection.iARM_deviceInf.iARMStatus; 
      }; 
      this.label_iARMStatus.BeginInvoke(act); 
      //detection.StopCheckArriving(); 
      //detection.StartCheckArriving(); 
     } 

我需要的代碼是阻止代碼。在此處:

Application.Run(new InProgram_iARMdetection()); //Blocking code 
+0

如果設備再次插入PC,則出現的對話框必須單獨插入。這表現不錯,但在主窗口後面。 – Rick2047 2010-04-14 11:21:43

+0

顯然,如果你想讓form2顯示爲對話框,你必須使用ShowDialog()方法。爲什麼在事件中使用Application.Run而不是ShowDialog()? – 2010-04-14 11:22:08

+0

@Aseem Gautam:Bcos當我使用form2Instance.ShowDialog()時,它第一次顯示,之後它也消失了,但在下一個刪除事件中不起作用。不知道爲什麼。所以Application.Run(new Form2()); – Rick2047 2010-04-14 13:07:25

回答

0

您應該在form2而不是form1上處理remove事件,並使用ShowDialog()方法。

因此,當form1上的到達事件將觸發它將打開form2就像一個對話框。現在,當設備將被拔出,在form2刪除事件將觸發您可以關閉窗體的位置。

1

也許mainform.AddOwnedForm(form2)會做你想做的。它會使form2顯示在mainform前面,當其中一個最小化時,另一個也是。

+1

是的,或者只是'form2.Show(this)' – 2010-04-14 11:31:14

+0

沒有按需要工作。 :(如果你需要任何其他參考plz提及 – Rick2047 2010-04-14 13:03:41

+0

當我嘗試AddOwnedForm()然後當我調用.show()它顯示: System.InvalidOperationException:跨線程操作無效:從線程訪問控制'OnProgram_iARMdetection'比其他線程將其在System.Windows.Forms.Form.set_Owner在System.Windows.Forms.Form.UpdateHandleWithOwner() 創建上。 在System.Windows.Forms.Control.get_Handle() (表格值) at System.Windows.Forms.Form.AddOwnedForm(Form ownedForm) OnProgram_iARMdetection已經在主窗體本身中實例化,並且從主窗體本身調用addOwnedForm()和Show()fns。 – Rick2047 2010-04-14 13:16:12

相關問題