マルチスレッドでフォームコントロールにアクセス

メインスレッド以外からフォームコントロールにアクセスするには、
delegateとInvokeメソッドを使います。

// こいつが噂のデリゲート
delegate void delegateHoge(string str);

// フォームにアクセスするメソッド
private void HogeHoge(string str){
    if(textBox1.InvokeRequired){
        delegateHoge d = new delegateHoge(HogeHoge);
        object[] obj = {str};
        Invoke(d, obj);
    }else{
        textBox1.Text = str;
    }
}

// スレッド処理
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    HogeHoge("ほげー");
}

簡単に説明すると、
if(textBox1.InvokeRequired){
の部分でメインスレッドなのかを判別して、必要な場合にInvokeメソッドを
使って、メインスレッドに処理をさせるようにしています。
イメージとしては、最初にマルチスレッド側でifの中が呼び出され、
その後、メインスレッドがelseの中を実行するイメージです。
HogeHogeの先頭でブレークをかけると、2回呼び出されるのが確認できると思います。



引数が無いようなメソッドだと、もう少し簡略化できます。
ほとんど同じですがね。

// こいつが噂のデリゲート
delegate void delegateHoge();

// フォームにアクセスするメソッド
private void HogeHoge(){
    if(textBox1.InvokeRequired){
        Invoke(new delegateHoge(HogeHoge));
    }else{
        textBox1.Text = "ほげー";
    }
}

// スレッド処理
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    HogeHoge();
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2007年08月31日 08:16
ツールボックス

下から選んでください:

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