アットウィキロゴ

GUIの別スレッドからの更新

  • 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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。