C#実装事例?

2008/09/08 WinPGM::C#

delegateについて

ググレカス→delegate C#

注意:Delegateクラスもある.delegate型とは別ぽい.

しかし,"デリゲートの使用 (C# プログラミング ガイド)"では,以下の記述がある.

デリゲート型は System.Delegate から派生するため、
このクラスで定義されているメソッドとプロパティをデリゲートで呼び出すことができます。

見た目・UI操作

強制クローズを禁止する.(システムメニューの削除,ALT+F4の終了排除.)
→参照 http://www.atmarkit.co.jp/fdotnet/dotnettips/142closebtn/closebtn.html



非同期プログラミング

宇宙仮面のC#プログラミング-非同期プログラミングと, 例のサンプルから推測交じりで消化.delegate,Thread class等の比較による紹介.

リード処理をdlegate宣言したクラス(変数?)にセットする.読み出し要求が発生したときに,BeginInvokeする.このとき,非同期callbackを行うため,AsyncCallbackオブジェクトも渡す.処理終了時に,AsyncCallbackオブジェクトを作るときのmethodが呼ばれる.引数として,(IAsyncResult)arを受け取る.キャストして,自分の定義したdeletgate型へ修正する.

ReadInputReportDelegate deleg = ( ( ReadInputReportDelegate )( ar.AsyncState ) ); 

ar.EndInvoke()でスレッド終了.この引数には,delegate宣言したmethodのうち,参照型'ref'をつけたものが順に渡せる.+ar自身.

deleg.EndInvoke( ref myDeviceDetected, ref inputReportBuffer, ref success, ar ); 

System.Object System.Delegate System.MulticastDelegate

この型のすべてのパブリック staticメンバは、スレッド セーフです。



Threadの寿命について

class methodをThreadStartクラスでインスタンス化したとき,そのクラスから半ば独立したthreadで起動する模様. 親windowが死んでも走り続けていたので,なぜか不思議であった.上記終了処理で子スレッド終了を待たせてみたが,スマートではないと思えたので検索↓.
k.kinukawa(momo_dev)の日記より,デフォルトはフォアグランドスレッド?として起動していた模様.
ハンドル類はcloseされることなく,そのスレッドが従属するクラスのデストラクタも呼び出されなかったため,裏でHID Read fileを無限に繰り返す状態になっていたようだ.


(Rxthread).IsBackground = true;

とセットしてから,

(RxThread).Start();

とすることで,バックグランドで走るようになった.親スレッド(Form)をcloseした際に,デストラクタが呼び出された.Threadは放置すると良くないと思ったので,thread.abort()で殺した.

この処理を実装しなくても,Thread objectのデストラクタかどこかで閉じられた模様.ファイルハンドルがどうなったのか….safefilehandle objectで触っていたから,これもデストラクタが綺麗にしてくれたのだろうか.不安が募るが,何という適当な処理言語だろう….runtimeでデバッグコードが走るようなものか?安全といえば安全だが.とりあえず明示的に殺すことにする.

デストラクタの宣言

C++と同じ.クラス名の先頭にチルダ'~'をつける.引数はナシ(空白).objectが破棄されるときに呼ばれるハズ.Formのクラスですが,ALT+F4では呼ばれなかった@デバッガ.breakがうまく効かなかっただけなのかなぁ...

class Foo { ...
  ~Foo()
  {
  }


process間データ通信について(C#→Win32native)

C# .Net SendMessageで他のアプリに文言を送信したいを参照.

キーワード:C# Alloc message lparam wparamで,探索.

OK キャンセル 確認 その他