私は、C++の別のスレッドおよび別のクラスからWinformコントロールを更新しようと苦労してきました。このトピックについていくつか質問がありますが、それぞれが何らかの形で不完全であるように思われ、不足している部分を解決できません。
私のWinformスレッドにはピクチャーボックスがあります。Webカメラから画像をキャプチャして処理する別のスレッドで実行される別のクラスがあります。次に、画像を画像ボックスのWinformスレッドに表示します。VS2010 SEC++を使用しています。
私のコードは次のとおりです。
//CameraThread.h
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Forms;
class Form1;
public class CameraThread
{
private:
Form1* frm1; // compiler does not like this line
public: CameraThread(Form1 *tfrm1) {
frm1 = tfrm1;
}
void PictureUpdater(void) {
try {
frm1->Invoke( Form1->UpdateBox() );
}
catch
{ };
}
//Form1.h
namespace SV7 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public: delegate void UpdateDelegate(void);
public:
Form1(void) {
// constructor code
}
void UpdateBox(void) {
if (this->RawImageBox->InvokeRequired) {
UpdateDelegate^ d = gcnew UpdateDelegate(this,&Form1::UpdateBox);
this->RawImageBox->Invoke(d);
}
else {
// code that actually updates this->RawImageBox
}
}
}
私のForm1クラスは正常にコンパイルされます。ただし、CameraThreadはForm1.UpdateBoxメソッドを参照する必要があります。上記のコードをコンパイルすると、CameraThreadがForm1へのポインターを宣言するために結びついている「const」を参照してエラーが発生します。Form1の前方宣言はそれを処理すると思いましたが、明らかにそうではありません。私の問題は、GUIスレッドから重要な作業を行うために別のスレッドとクラスを使用するすべての人が遭遇する問題のように思われるので、私の質問が他の人がテンプレートとして使用できる応答を促すことを期待しています。私はマルチスレッドに比較的慣れておらず、C ++の専門知識もあまり主張していないので、これが愚かなことであるとお詫びします。