• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッド)

VC++2008ExpressEditionを使用してプログラムを作成する際のエラー対処法

このQ&Aのポイント
  • VC++2008ExpressEditionを使用してプログラムを作成しています。Windowsフォームアプリケーションを作成し、TextBoxとButtonを配置し、ボタンを押すと特定のコードが実行されるようにしました。しかし、コントロール 'logBox' へのアクセスエラーが発生しています。このエラーの回避方法を教えてください。
  • ボタンを押すと実行される特定のコードで、'logBox' へのアクセスエラーが発生しています。このエラーの回避方法を教えてください。
  • Windowsフォームアプリケーションを作成し、特定のコードが実行されるようにしましたが、コントロール 'logBox' へのアクセスエラーが発生しています。このエラーの回避方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

デリゲートを使ってコントロールのオーナースレッドから制御するようにします。 http://msdn.microsoft.com/ja-jp/library/ms171728(VS.80).aspx 書式としてはC#のコード例の方が参考になるかと。 なお面倒なら上記ページに書かれている > この例外を無効にするには、CheckForIllegalCrossThreadCalls プロパティの値を false に設定します。このように設定すると、コントロールは、Visual Studio 2003 で実行した場合と同じように動作します。 の方法で例外が発生しないようにできるようです。 ただし本質的に安全な方法ではないのでリスクと天秤にかけた上でやってください。

glarelance
質問者

お礼

解答有り難うございます。 教えて貰った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 つの引数が必要です と出てきます。 これはいったい何故なのでしょうか?

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

ちょっと間違ったので訂正。 ×: Invoke()のプロトタイプには ・Invoke(Object ^, IntPtr) ・Invoke(void (*)()) ○: funcDelegate()(コンストラクタ)のプロトタイプには ・funcDelegate(Object ^, IntPtr) ・funcDelegate(void (*)())

glarelance
質問者

お礼

なるほど、大体解りました。 どうも有り難うございました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

C++/CLIはあまり深く触ってないので想像での回答ですが、マネージドなクラス(gcnewでオブジェクトを作成するもの)は関数ポインタが取れない、ということかもしれません。 こう想像する理由は、Invoke()のプロトタイプには ・Invoke(Object ^, IntPtr) ・Invoke(void (*)()) の二つがあるかと思いますが、明らかに後者にマッチするように書いていてもはじかれるためです。