.net Frameworkのウィンドウコンポーネントはスレッドセーフではありません。ウィンドウのコンポーネントはメインスレッドで処理されますから、自分で作成したスレッドからフォーム上のコンポーネントのプロパティを操作する場合はInvokeしなければならないのが.netの作法らしいです。Invokeしなくてもなんとなく動作しますが、原因不明のデッドロックに悩まされることになるでしょう。
__delegate void delegateSetMode(System::Int32 mode);
delegateSetMode *p = new delegateSetMode(panel, &ControlPanel::SetMode);
p->BeginInvoke(mode, 0, 0);
InvokeするとSetModeの呼び出しが予約されます。この時点では実際にはメソッドコールは行われません。呼び出されたスレッドが適当なタイミングでSetModeを呼び出します。
Invoke呼び出しには2種類あります。
Invoke
相手スレッドがそれを処理し終えるまでブロックする。
BeginInvoke
相手スレッドに処理を委託するだけでブロックしない。
BeginInvokeで依頼した処理が終了したかどうかを判定する方法は2つあります。
EndInvokeを呼び出す。→処理が終わるまでブロックされます。
BeginInvokeの引数にコールバック関数を設定する。→処理完了時に設定したコールバック関数が呼ばれます。
__delegateというキーワードですが、内部的にはMulticastDelegateというクラスを継承して新しいクラスを生成するようです。つまり上記のdelegateSetFrameというのはMulticastDelegateから派生した1つのクラスであるわけです。__delegateは関数内で宣言できない、使うときにnewしなければならないなどの不思議なルールや制限がありますが、クラスの宣言だということがわかればすんなり理解できるでしょう。
チチコスの子の乳をちちくりまくったぞw
したら割れ目からすっげぇ気がいっぱい溢れてきたから、
オラの元気玉をトコトンぶっぱなしてやったぞ!!!!
キジョーイしてもらうバ イ トおもろすぐるwwwwww
オレ動かなくても勝手にイって5万くれるし。。。
ちょっと試すだけのつもりだったのになぁ(^^;