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

「マルチスレッドでフォームコントロールにアクセス」の編集履歴(バックアップ)一覧はこちら

マルチスレッドでフォームコントロールにアクセス」(2007/08/31 (金) 08:16:08) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

メインスレッド以外からフォームコントロールにアクセスするには、 delegateとInvoke<b style="color:black;background-color:#a0ffff">メソッド</b>を使います。 // こいつが噂のデリゲート delegate void delegateHoge(string str); // フォームにアクセスする<b style="color:black;background-color:#a0ffff">メソッド</b> 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 <b style="color:black;background-color:#ffff66">backgroundWorker1_DoWork</b>(object sender, DoWorkEventArgs e) { HogeHoge("ほげー"); } 簡単に説明すると、 if(textBox1.InvokeRequired){ の部分でメインスレッドなのかを判別して、必要な場合にInvoke<b style="color:black;background-color:#a0ffff">メソッド</b>を 使って、メインスレッドに処理をさせるようにしています。 イメージとしては、最初にマルチスレッド側でifの中が呼び出され、 その後、メインスレッドがelseの中を実行するイメージです。 HogeHogeの先頭でブレークをかけると、2回呼び出されるのが確認できると思います。 引数が無いような<b style="color:black;background-color:#a0ffff">メソッド</b>だと、もう少し簡略化できます。 ほとんど同じですがね。 // こいつが噂のデリゲート delegate void delegateHoge(); // フォームにアクセスする<b style="color:black;background-color:#a0ffff">メソッド</b> private void HogeHoge(){ if(textBox1.InvokeRequired){ Invoke(new delegateHoge(HogeHoge)); }else{ textBox1.Text = "ほげー"; } } // スレッド処理 private void <b style="color:black;background-color:#ffff66">backgroundWorker1_DoWork</b>(object sender, DoWorkEventArgs e) { HogeHoge(); }
メインスレッド以外からフォームコントロールにアクセスするには、 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(); }

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

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