//別スレッドからメインスレッドのフォーム上のコントロールのメソッドを呼ぶためにデリゲートを定義
//引数が必要な場合
delegate void SetFocusDelegate1(int);
//引数が必要ない場合
delegate void SetFocusDelegate2();
//別スレッドからメインスレッドのフォーム上のコントロールのメソッドを呼ぶためのデリゲートに登録するメソッドを定義
//引数有の場合
void SetFocus1(int i) {
//別スレッドから呼ばれた場合は if文内に入る
if (this->InvokeRequired) {
MessageBox::Show("別スレッドから呼び出し" + i, "InvokeRequired");
//別スレッドからコントロールのメソッドをそのまま呼ぶとエラー
//this->textBox2->Focus();
//別スレッドからの呼び出しによる、メインスレッドのフォーム上のコントロールのメソッドを呼ぶためのデリゲートに、実行するメソッドを登録
SetFocusDelegate1^ focusDel = gcnew SetFocusDelegate1(this, &Form1::SetFocus1);
//メインスレッドから SetFocus1() を実行してもらうために SetFocus1() が登録されたデリゲートを実行
//二番目の引数にデリゲートに渡す引数を渡す
this->Invoke(focusDel, i+1);
//ここで return しないと下に流れて別スレッドから this->textBox2->Focus() が呼ばれてエラーとなる
return;
}
//以下メインスレッド上から呼ばれた時の処理
MessageBox::Show("メインスレッドから呼び出し" + i, "InvokeRequired");
//メインスレッドからの呼び出しなのでエラーはでない
this->textBox2->Focus();
return;
}
//引数無の場合
void SetFocus2() {
//別スレッドから呼ばれた場合は if文内に入る
if (this->InvokeRequired) {
MessageBox::Show("別スレッドから呼び出し", "InvokeRequired");
//別スレッドからコントロールのメソッドをそのまま呼ぶとエラー
//this->textBox2->Focus();
//メインスレッドから SetFocus1() を実行してもらうために SetFocus1() が登録されたデリゲートを実行
//*デリゲートの定義も一度に行うこともできる
this->Invoke(gcnew SetFocusDelegate2(this, &Form1::SetFocus2));
return;
}
//以下メインスレッド上から呼ばれた時の処理
MessageBox::Show("メインスレッドから呼び出し", "InvokeRequired");
//メインスレッドからの呼び出しなのでエラーはでない
this->textBox2->Focus();
return;
}
//別スレッドで実行されるメソッドを定義
//このメソッドは引数を取れない
//SetFocusが引数有の場合
void worker1(System::Object^ i) {
SetFocus1(safe_cast(i));
return;
}
//引数無の場合
void worker2() {
SetFocus2();
return;
}
//「別スレッドでfocus引数有」ボタンが押されたとき
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//別スレッドで実行するメソッドをデリゲートに登録(スレッドとして実行するメソッドに引数を渡す場合)
System::Threading::ParameterizedThreadStart^ s = gcnew System::Threading::ParameterizedThreadStart(this, &Form1::worker1);
//別スレッドで実行するデリゲートをスレッドとして作成
System::Threading::Thread^ t = gcnew System::Threading::Thread(s);
//スレッドスタート 引数は適当
t->Start(15);
}
//「メインスレッドでfocus引数有」ボタンが押されたとき
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
this->SetFocus1(10); //引数は適当
}
//「別スレッドでfocus引数無」ボタンが押されたとき
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
//別スレッドで実行するメソッドをデリゲートに登録(スレッドとして実行するメソッドに引数を渡さない場合)
System::Threading::ThreadStart^ s = gcnew System::Threading::ThreadStart(this, &Form1::worker2);
//別スレッドで実行するデリゲートをスレッドとして作成
System::Threading::Thread^ t = gcnew System::Threading::Thread(s);
t->Start();
}
//「メインスレッドでfocus引数無」ボタンが押されたとき
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
this->SetFocus2();
}
※コメント投稿者のブログIDはブログ作成者のみに通知されます