メインスレッド以外からフォームコントロールにアクセスするには、
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();
}
最終更新:2007年08月31日 08:16