System::Threading::ThreadとかSystem::IO::FileSystemWatcherとかdelegateとか
色々とトライ&エラーしてたので、忘れないようにメモw
まずはThread。Threadを生成した側が終了しても、gcnewしたThreadはそのままらしい・・・(^-^;
先日(というか先月)、起動したThreadでポートを開けてListenするようなコードを書いてたわけなんですけど、途中でプログラム停止させたらポートが開きっぱなしに・・・orz
どんな実装してるんでしょー?(^-^;
他にも、そのコードのサンプルはどうかと・・・・と思うようなものがあって、今日、そのまま使ってて変にはまってたのが、System::IO::FileSystemWatcherとdelegate。
FileSystemWatcherでイベント拾って、拾った先でdelegateでGUIにデータをセットするというもの。
で、はまった原因がこれ↓ ぇぇここからの抜粋です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 )
- static不要。/*source*/とかコメントアウトしなくても・・・
- static不要。/*source*/とかコメントアウトしなくても・・・
- gcnew FileSystemEventHandler( Watcher::OnChanged )
- gcnew FileSystemEventHandler( this, &Watcher::OnChanged )に変更
そして、ファイルを作成すると同じイベントが大量に発生する罠・・・(^-^;
イベントのハンドラで色々処理している影響かも知れませんがーw
delegateの仕組みも良くわかんなかったけど、
- delegate指定で定義するのは器。
- 実体は別名で定義して処理を実装。ただし、delegateで定義した関数と同じI/Fにする。
- this->Invoke( gcnew delegate指定のメソッド( this, &処理を定義したメソッド ), 引数のリスト);とやれば呼び出せる(同一クラスのメソッドとして定義した場合)
ということで、自分的に勝手に納得してみましたw GUI操作ができればとりあえずOKなのでw