デリゲートスレッド
- BeginInvokeとEndInvokeは対になって必ず呼ばないとダメ。メモリリークする。
- DelegateThreadのインスタンスは、クラスのメンバ変数に持たせるのが吉。
- スレッドの処理でメインとなる部分は、必ず終了条件を持たせておけば、途中で終了させることも可能。EndInvokeは直接呼ばない。
- 直接呼ばずにスレッドを終了させる場合、前述の終了条件フラグを立ててやる。
- EndInvokeは、スレッドが終了した後に呼ばれる終了イベントの関数(BeginInvokeで登録したやつ)の引数を使って呼ぶべし。
- デリゲートスレッドに通常のスレッドと同じように名前を付けたい場合(デバッガに表示させたい場合)、デリゲートスレッドで起こした関数内で「System::Threading::Thread::CurrentThread->Name」プロパティに名前を代入してやればいい(→ただし一度だけしか設定してはならない)。
デリゲートスレッドの終了時の処理
デリゲートスレッド終了時には、次の手段で行う。
System::Void MyClass::OnEnd_MyDelegateThread(System::IAsyncResult * ar) { try { MyDelegate * ed = __try_cast<MyDelegate*>(ar->AsyncState); /* (a) */ if (ed != NULL) { ed->EndInvoke(ar); } } catch (System::Exception * exception) { System::Diagnostics::Debug::WriteLine(exception->ToString() ); } }
ただし、(a)のキャストは失敗する可能性がある。
失敗する場合は、BeginInvokeの第二引数に0を与える。