ニコニコC++入門

入門サイトや市販の入門書では絶対に教えてくれない、C++の本当の使い方を教えます。

別スレッドからフォームのコンポーネントを操作するには

2005-07-31 23:24:41 | Managed C++

.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しなければならないなどの不思議なルールや制限がありますが、クラスの宣言だということがわかればすんなり理解できるでしょう。


最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
天職キタ(*´ω`*) (大岩井)
2010-02-14 03:36:28

キジョーイしてもらうバ イ トおもろすぐるwwwwww
オレ動かなくても勝手にイって5万くれるし。。。

ちょっと試すだけのつもりだったのになぁ(^^;
返信する
オラわくわくしてきたぞw (こくう)
2010-02-04 09:14:12

チチコスの子の乳をちちくりまくったぞw
したら割れ目からすっげぇ気がいっぱい溢れてきたから、
オラの元気玉をトコトンぶっぱなしてやったぞ!!!!

返信する