目次
前
次
delegateとinvoke
C#、VB.NETを利用すると、クラスからオブジェクトインスタンスを
生成して、複数のスレッドを使って処理するプログラミングが要求
されました。
一度マルチプロセスによるアプリケーション開発を経験しましたが、
マルチスレッドは未経験です。そこで、Internetで情報を集めます。
いろいろなホームページを参考にし、ハードウエアを作るのと同じ
ようにすればよいと理解できました。
自分は、ロボットを動かしたいという動機で、コンピュータを触り始めました。
マイクロコンピュータの性能が低かった時代だったので、デジタル回路を接続
して、機能強化と性能アップをしていました。
デジタル回路で付加した機能を、マイクロコンピュータ(マイコン)から
利用するために、新たにプログラムコードを入れます。
これと似た機構は何かというと、delegateとinvokeでした。
invokeは、新たに入れたプログラムコードを実際に使うことで
delegateは、新たに入れたプログラムコードがあることを宣言
することです。
このカタチを理解できたとき、万歳しました。(^o^)
実際にハードウエア付加ではなく、クラスメソッドを使う仕組み
というのが正しいのですが、ハードウエアから入った自分として
は、上の解釈で充分でした。
やりたいことは、以下の3つです。
- 受信文字列の表示
- 受信文字列のファイルへの保存
- 受信文字列クリア
この3機能を使いたいので、delegateを利用して
定義してあると宣言します。
delegate void TextSet(string stxt);
delegate void SaveText(string text);
delegate void ClrText();
この宣言で、複数のスレッドから3機能が見えるようになります。
見えれば、使う側のスレッドはinvokeを利用してメソッドを呼び
出します。
invokeは、次の2パラメータを指定します。
- メソッドのエントリアドレス
- メソッドに渡すパラメータのエントリアドレス
今回は、テキストボックスのクラスメソッドとして3機能を
定義してあるので、クラスのオブジェクトインスタンス名を
使いエントリアドレスを指定します。
パラメータは、オブジェクトインスタンスを確保して
その中に入れて渡します。
テキストボックスクラスのオブジェクトインスタンスは
rMyTextBox
としたので、3機能を利用する場合は、次のようにコード
を記述します。
受信文字列の表示
Invoke(new TextSet(rMyTextBox.SetText), new object[] { result });
受信文字列のファイルへの保存
Invoke(new SaveText(rMyTextBox.SaveText), new object[] { gFName });
受信文字列クリア
Invoke(new ClrText(rMyTextBox.ClrText));
作成コードが動いたときは、嬉しかったのですが
「随分と面倒だなあ。」と思いました。
マルチスレッドであることを理解すれば、この程度ならば
と思わないではないですが。もっと簡単に使える仕組みに
しないと、いけないのではと思います。
目次
前
次