1

私がいる研究室の周りのさまざまなマシンと通信するボックスを表すクラス「Blackbox」があります。このクラスは他の人によって書かれているため、その内部がどのように機能するかわかりません。

私が通常 Blackbox クラスを使用する方法は、Blackbox オブジェクトを作成し、物理ボックスに接続してから、次のようにリスナー メソッドを追加することです。

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
    }
}

ここでダイアログが作成され、イベントリスナー以外のほとんどすべてが機能します。b.sendMessage() などの他の Blackbox 関数を使用して、MyDialog 内でマシン メッセージを正常に送信できます。なぜこれが起こっているのか誰にも分かりますか?

さらに、MyDialog 内で b.messageReceived("test") のようなことをすると、myNewFunction("test") が呼び出されてしまいます。どういうわけか作成された 2 つの Blackbox オブジェクトがあるかのようです。これは Blackbox の実装によるものでしょうか、それとももっと根本的な C# の理由があるのでしょうか?

御時間ありがとうございます。

4

2 に答える 2

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
    }

}
于 2013-05-09T04:28:32.840 に答える
1

Form機能させるには、 toを渡す必要がありますApplication.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));
}

これにより、イベントが機能するために必要なメッセージ ポンプが設定されます。

于 2013-05-09T04:09:37.073 に答える