- PR -

非同期での画面上のコントロールの操作は正しいのでしょうか.

1
投稿者投稿内容
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 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か?
 もっと他にエレガントな手法がありそーだ

と悩んでいます. よろしければお知恵を拝借したいです
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-10-05 22:02
.NETで別スレッドからコントロールを操作する場合は、Control.Invoke メソッドまたはControl.BeginInvoke メソッドを使用します。
ちなみに、これらのメソッドを使用する必要があるかどうかはControl.InvokeRequired プロパティで判断できます。
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2005-10-05 23:30
ognacです.
早速のRESありがとうございました.
Control.invoke( delegate address) ですんなり解決しました.
MSのクイックツアーにも掲示があったのでね... よう見つけませんでした..
すっきりしました。
奈良漬け
会議室デビュー日: 2004/09/24
投稿数: 3
投稿日時: 2005-11-08 20:58
こんにちは。
Invokeに関して,ついでに質問させてください。

言語はC++.NETを使用していますが,
Windows.Formアプリで,Form上のDataGridやListBox等のコントロールに,
DataTable等のDataSourceの内容を表示したいと思っています。

このとき,非同期コールバックやスレッドプロシージャの中でDataTableの内容を変更して,DataGridに正しく表示するにはどうしたらよいのでしょうか。
DataTableにはInvokeメソッドが無いので,どうしたら良いか分からずつまずいております。

過去ログやMSDNの読み込みが不足しており恐縮ですが
よろしくお願いいたします。
Freyr
会議室デビュー日: 2005/11/22
投稿数: 1
投稿日時: 2005-11-22 17:49
> 非同期コールバックやスレッドプロシージャの中でDataTableの内容を変更して,
> DataGridに正しく表示するにはどうしたらよいのでしょうか
変更処理を排他制御すれば宜しいかと。

lock(dataTable.Rows.SyncRoot)
{
// 変更処理
}

↑な感じ。
1

スキルアップ/キャリアアップ(JOB@IT)