2013-05-09 77 views
1

我有一個類「黑盒子」,它代表了一個盒子,周圍我在實驗室裏各種機器進行通信。這個類是別人寫的,所以我不能看到另一個對象它的內部是如何工作的。事件處理作爲參數傳遞的對象爲

我通常使用的黑盒類的方法是通過構建一個黑箱對象,連接至所述物理框,然後添加監聽方法如下:在相同

Blackbox b = new Blackbox("192.168.0.2"); 
b.messageReceived += myFunction; 

然後,我通常有一些像

private void myFunction(string s) 
{ 
    // do something with s 
} 

這通常做工精細,每當黑盒從一臺機器得到一個消息,它與我可以處理字符串調用myFunction的。

現在,當我嘗試將黑盒傳遞給另一個窗體時,出現了這個問題,示例代碼如下(我正在編寫代碼以儘量減少(我認爲是)不相關的細節。終於成功地這樣做)。

static class Program 
{ 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Blah()); 
    } 
} 

class Blah : Form { 

    public Blah() 
    { 
     InitializeComponent(); 

     Blackbox b = new Blackbox("192.168.0.2"); 
     MyDialog md = new MyDialog(b); 
     md.ShowDialog(); 
    } 
} 

class MyDialog : Form 
{ 
    private Blackbox b; 

    public MyDialog(BlackBox b) : this() 
    { 
     this.b = b; 
     b.messageReceived += myNewFunction; 
    } 

    private void myNewFunction(string s) 
    { 
     // this function never ends up being called 
    } 
} 

這裏的對話框中創建和幾乎所有的功能除了事件偵聽器。我可以使用其他Blackbox函數(如b.sendMessage())在MyDialog中發送機器消息。有誰知道爲什麼會發生這種情況?

而且,如果我這樣做:b.messageReceived( 「測試」)內MyDialog,myNewFunction( 「測試」)最終被調用。就好像有兩個以某種方式創建的Blackbox對象。這可能是由於Blackbox的實施或者是否有一個更基本的C#原因,爲什麼這是?

謝謝你的時間。

回答

1

你需要通過你的FormApplication.Run,以便爲它工作。

http://msdn.microsoft.com/en-us/library/aa334771(v=vs.71).aspx

所以,你主要應該是這樣的:

static void main(string[] args) 
{ 
    Blackbox b = new Blackbox("192.168.0.2"); 
    Application.Run(new MyDialog(b)); 
} 

這將設置爲需要工作的事件消息泵。

+0

感謝您的回答。看來我沒有更好地提出這個問題的代碼可能讓我錯過了一些重要的東西。對我而言,沒有主要的方法,而是從另一個表單調用對話框。當我嘗試從它內部調用Application.Run()時,我得到一個「InvalidOperationException」,說我無法在單個線程中啓動第二個消息循環。我將在我的問題中編輯代碼,對此感到抱歉。 – muzzlator 2013-05-09 04:18:46

1

你在對話類中保留對「b」的引用嗎?

class MyDialog : Form 
{ 

    private BlackBox b; 

    public MyDialog(BlackBox b) : this() 
    { 
     this.b = b; 
     b.messageReceived += myNewFunction; 
    } 

    private void myNewFunction(string s) 
    { 
     // this function never ends up being called 
    } 

} 
+0

對不起,還有更多的細節,我可能應該保留。是的,我保留一個參考。我試圖減少代碼,以便我沒有最終得到一個大問題 – muzzlator 2013-05-09 05:07:53

+0

不幸的是,我認爲我們需要看到更多的代碼來弄清楚。它與md.Show();與'md.ShowDialog();'有什麼不同? – 2013-05-09 12:29:18

+0

它使用md.Show()也不會有任何不同。所以看起來好像它不是與對話相關的。當我明天可以訪問它時,我會提供更多代碼,但不幸的是,我現在無法訪問我所在的位置。非常感謝,感謝幫助。 – muzzlator 2013-05-09 14:49:39

相關問題