- - PR -
非同期での画面上のコントロールの操作は正しいのでしょうか.
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-10-05 21:52
OGNACです.
いつもお世話になっています。 Windows.Formアプリです. VS2003/VS2005.VBを想定してます. Form上にに複数個の コントロール(ラジオボタン, テキストボックス, グループボック ス, ボタン等)がn個あります. ラジオボタンの状態に従って,, 有効なコントロールのEnable状態を切り替えをしま す. Mediatorパターンの考え方のつもりです. ラジオボタンのCheck-Eventで, 可否管理ルーチンをcallすれば済みますが, Check_Eventと同期動作になります. コストのかかる処理をEventルーチンに任すのは如何かなと思っています. 非同期動作で,コントロールを制御したいな...と試行しています。 ・スレッドを起動して処理. Form上のコントロールは別スレッドからは操作できない.....と叱られます. ・PostMessage で, UserMessage を送り, WND_PROC で処理すれば,可能でした. しかし,不安感が残ります. Win32.APIを使用してますが, .NETの流儀に反していないか.APIは原則×と認識していますが. Win64 に移行したとき,障害にならないか. 将来版の.netでも OKか? もっと他にエレガントな手法がありそーだ と悩んでいます. よろしければお知恵を拝借したいです |
|
投稿日時: 2005-10-05 22:02
.NETで別スレッドからコントロールを操作する場合は、Control.Invoke メソッドまたはControl.BeginInvoke メソッドを使用します。
ちなみに、これらのメソッドを使用する必要があるかどうかはControl.InvokeRequired プロパティで判断できます。 |
|
投稿日時: 2005-10-05 23:30
ognacです.
早速のRESありがとうございました. Control.invoke( delegate address) ですんなり解決しました. MSのクイックツアーにも掲示があったのでね... よう見つけませんでした.. すっきりしました。 |
|
投稿日時: 2005-11-08 20:58
こんにちは。
Invokeに関して,ついでに質問させてください。 言語はC++.NETを使用していますが, Windows.Formアプリで,Form上のDataGridやListBox等のコントロールに, DataTable等のDataSourceの内容を表示したいと思っています。 このとき,非同期コールバックやスレッドプロシージャの中でDataTableの内容を変更して,DataGridに正しく表示するにはどうしたらよいのでしょうか。 DataTableにはInvokeメソッドが無いので,どうしたら良いか分からずつまずいております。 過去ログやMSDNの読み込みが不足しており恐縮ですが よろしくお願いいたします。 |
|
投稿日時: 2005-11-22 17:49
> 非同期コールバックやスレッドプロシージャの中でDataTableの内容を変更して,
> DataGridに正しく表示するにはどうしたらよいのでしょうか 変更処理を排他制御すれば宜しいかと。 lock(dataTable.Rows.SyncRoot) { // 変更処理 } ↑な感じ。 |
1