別のスレッドで実行されている別のクラスから Winform ピクチャボックスを更新しようとしています。Update WinForm Controls from another thread _and_ classの回答に従いました。このクラスには、Winform/Winform メンバー関数への参照をコンストラクター内のスレッドに正確に渡す方法/Winform メンバー関数の呼び出し方法以外のすべての情報が含まれているようです。スレッドから。
私のコードは次のとおりです。
//Camera.h
public class CameraThread
{
public:
CameraThread(????)
{
// constructor
}
void DoSomething
{
// call UpdateBox on Form1
????
}
};
//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;
public ref class Form1 : public System::Windows::Forms::Form
{
private: CameraThread* CT;
private: boost::thread* ImageACQ;
public: delegate void UpdateDelegate(void);
public:
Form1(void)
{
CT = new CameraThread(????);
boost::thread* ImageACQ = new boost::thread(&CameraThread::ImageAcquisition,CT);
InitializeComponent();
InitializeCanny();
}
void UpdateBox(void)
{
if (this->RawImageBox->InvokeRequired)
{
UpdateDelegate^ d = gcnew UpdateDelegate(this,&Form1::UpdateBox);
this->RawImageBox->BeginInvoke(d);
}
else
{
}
}
};
}
???? をどこに置いたのか、メンバー関数を渡す/呼び出すために使用する構文がわかりません。Camera.h で Form1 の前方宣言が必要だと思いますが、Form.h で実際のフォーム クラスを参照するのに問題がありました。ただし、ストレートな関数ポインターが使用された場合、それは適切な方法ではないと思います。
背景として、私は VS2010 SE C++ を使用しています。ウェブカメラから画像を取得し、OpenCV を使用して処理し、結果を GUI スレッドのピクチャ ボックスに表示する別のスレッドを作成しようとしています。
私はこれを行う方法を知らないだけで、ガイダンスをいただければ幸いです。前もって感謝します/