- GUIコントロール(TextBox等)は、基本的に同じスレッドからしかプロパティにアクセスできない。
- 別スレッドからのアクセスは、Control.Invoke()を使ってデリゲート越しに実現させる。(TextBoxクラスはControlクラスの派生クラス)
…
// デリゲートの宣言
private delegate void deleDispCount(UInt32 inCounter);
// デリゲート
private void subThread(UInt32 inCounter)
{
// デリゲートの作成
deleDispCount dCount = new deleDispCount(ReCount);
// ★☆ Control.Invokeメソッドを利用することで、コントロールのプロパティを更新可能。
// ★☆ Control.Invokeメソッドはデリゲートを引数に持つので、
// ★☆ デリゲートの中にコントロールのプロパティを更新する処理(メソッド)を入れる。
textBox1.Invoke(dCount, new object[] { inCounter });
}
// デリゲートで呼ばれるメソッド
void ReCount(UInt32 cnt)
{
// TextBoxコントロールのプロパティの更新処理
textBox1.Text = cnt.ToString();
}
…
- コントロールは総じてスレッドセーフでないので、別スレッドからの更新にはこのような特別な仕掛けが必要。
- MSDNをみると、.NET Frameworkの各クラスのドキュメント内には、そのクラスがスレッドセーフか否かが書いてある。
最終更新:2009年09月19日 22:39