私は C# の初心者で、シリアル通信を使用する動的 GUI を実装する方法に取り組んでいました。私はもともと C 出身なので、関数ポインタの概念はよく知っています。
基本的に、シリアル コマンドが処理されたときに answerFunction() 関数を呼び出したいと思います。理論
的には、実行時に動的に作成されるクラス lbl_txtBox_Pair があります。
シリアル ポートと通信するクラス comObject があります。
1 つのシリアル コマンドに関するすべての情報を保持する 3 番目のクラスの comPacket があります。
- クラス lbl_txtBox_Pair のオブジェクトで、Packet をインスタンス化し、シリアル コマンドの終了時にどの関数を呼び出す必要があるかを伝えます。
- パケット オブジェクトを comObject インスタンスに渡します。
- 処理された後、comObject は、Packet オブジェクトに格納されているデリゲートを呼び出すことによって、パケットの元の送信者に通知したいと考えています。
何らかの理由で、私はそれを機能させることができません。Packet の Attribute は呼び出し可能ではないことがわかります。私は何かひどく間違ったことをしていますか?
コードは次のとおりです。まず、クラス "lbl_txtBox_Pair" のコードです。ここで comPacket を作成し、それを comObject に渡します。
public delegate void answerHandler( comPacket packet);
public void txb_value_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
{
answerHandler answerMethod = new answerHandler(this.processAnswer);
comPacket question = new comPacket(this.command, answerMethod, 1);
comObject.addPacket(question);
}
}
comPacket のコンストラクター。ここで、デリゲートは後で呼び出されるように格納されます。
public Delegate answerFunction;
public comPacket(string cmd, Delegate func, int prio)
{
this.cmd = cmd;
answerFunction = func;
this.prio = prio;
}
comObject では、パケットが処理されます。終了したら、パケットに格納されている関数を呼び出したいと思います。ちなみに、comObject は別の Thread で実行されます。
if (this.isEndtocken(inputline))
{
listen = false;
packet.answerFunction(packet);
}
そして、これが壊れた場合です。packet.answerFunction(パケット); 実行されず、メソッドとして呼び出すことはできないと言います。
どこが間違っているのか誰にもわかりますか?デリゲートがデリゲートか何かであるという情報を失っているように見えると思います。それとも、他のタイプのコールバック / イベント メソッドを使用するようにコードを完全に再構築する必要がありますか?