※ ChatGPTを利用し、要約された質問です(原文:スレッド)
VC++2008ExpressEditionを使用してプログラムを作成する際のエラー対処法
このQ&Aのポイント
VC++2008ExpressEditionを使用してプログラムを作成しています。Windowsフォームアプリケーションを作成し、TextBoxとButtonを配置し、ボタンを押すと特定のコードが実行されるようにしました。しかし、コントロール 'logBox' へのアクセスエラーが発生しています。このエラーの回避方法を教えてください。
ボタンを押すと実行される特定のコードで、'logBox' へのアクセスエラーが発生しています。このエラーの回避方法を教えてください。
Windowsフォームアプリケーションを作成し、特定のコードが実行されるようにしましたが、コントロール 'logBox' へのアクセスエラーが発生しています。このエラーの回避方法を教えてください。
VC++2008ExpressEditionを使用してプログラムを作成しています。
Windowsフォームアプリケーションを作成し、そこに、TextBoxとButtonを放り込み、ボタンを押すと以下のようなコードが実行されるようにしました。
関数testfuncはhoge::Form1::testfuncという風な場所で定義されています。
logBoxは、Form1のコンストラクタのTODOの部分で作成しています。
public: static System::Windows::Forms::TextBox^ logBox;
void testfunc(){
int i;
for(i=0;i<200;i++){
int t=clock();
while(10>clock()-t);
logBox+=L"aaraeaewa"+i+L"\r\n";
logBox->SelectionStart = logBox->Text->Length;
logBox->ScrollToCaret();
}
}
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
button1->Enabled=false;
button1->Text=L"実行中";
button1->Update();
ThreadStart^ trddel=gcnew ThreadStart(this,&hoge::Form1::testfunc);
Thread ^trd=gcnew Thread(trddel);
trd->Start();
button1->Enabled=true;
button1->Text=L"実行";
}
この関数をボタンを押して実行すると、testfunc関数の
logBox->SelectionStart = logBox->Text->Length;
の部分で、
'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。
追加情報: 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'logBox' がアクセスされました。
という風なエラーが出ます。
読んだ感じだと、元々のスレッドで作成したコントロールを新しく作ったスレッドからコントロールすることは出来ないって感じのことが書かれているのですが、どの様にすればこれは回避できるようになるのでしょうか?
お礼
解答有り難うございます。 教えて貰ったURLと、 http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html を参考にして、スレッドの呼び出しは出来るようになりました。 ただ、 delegate void funcDelegate(); と、定義しているのに、実際にInvokeで使用しようとした場合、 Invoke(gcnew funcDelegate(this,&hogehoge::Form1::testfunc)); のように、thisポインタを使わず、funcDelegate(&testfunc) とすると、 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&hogehoge::Form1::testfunc' を使用してください error C3350: 'hogehoge::Form1::funcDelegate' : delegate コンストラクタには 2 つの引数が必要です と出てきます。 これはいったい何故なのでしょうか?