System::Threading::ThreadとかSystem::IO::FileSystemWatcherとかdelegateとか

色々とトライ&エラーしてたので、忘れないようにメモw

まずはThread。Threadを生成した側が終了しても、gcnewしたThreadはそのままらしい・・・(^-^;

先日(というか先月)、起動したThreadでポートを開けてListenするようなコードを書いてたわけなんですけど、途中でプログラム停止させたらポートが開きっぱなしに・・・orz

どんな実装してるんでしょー?(^-^;


他にも、そのコードのサンプルはどうかと・・・・と思うようなものがあって、今日、そのまま使ってて変にはまってたのが、System::IO::FileSystemWatcherとdelegate

FileSystemWatcherでイベント拾って、拾った先でdelegateGUIにデータをセットするというもの。

で、はまった原因がこれ↓ ぇぇここからの抜粋ですw


static void OnChanged( Object^ /*source*/, FileSystemEventArgs^ e ){

   :snip

}
   :snip

FileSystemWatcher^ watcher = gcnew FileSystemWatcher;

   :snip

watcher->Changed += gcnew FileSystemEventHandler( Watcher::OnChanged );

   :snip

  • static void OnChanged( Object^ /*source*/, FileSystemEventArgs^ e )
  • gcnew FileSystemEventHandler( Watcher::OnChanged )
    • gcnew FileSystemEventHandler( this, &Watcher::OnChanged )に変更

そして、ファイルを作成すると同じイベントが大量に発生する罠・・・(^-^;

イベントのハンドラで色々処理している影響かも知れませんがーw



delegateの仕組みも良くわかんなかったけど、

  • delegate指定で定義するのは器。
  • 実体は別名で定義して処理を実装。ただし、delegateで定義した関数と同じI/Fにする。
  • this->Invoke( gcnew delegate指定のメソッド( this, &処理を定義したメソッド ), 引数のリスト);とやれば呼び出せる(同一クラスのメソッドとして定義した場合)

ということで、自分的に勝手に納得してみましたw GUI操作ができればとりあえずOKなのでw