我正在尝试从另一个线程上运行的另一个类更新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线程的图片框中显示结果。
我只是不知道如何做到这一点,并希望得到任何指导。提前谢谢/
答案 0 :(得分:1)
您需要在类中使用Form1实例,因此构造函数调用应如下所示:
CT = new CameraThread(this);
我对C ++ / CLI的了解不多,所以也许它不是完美的语法,但意思应该是清楚的。您的类必须获取Form1的实例并将其保存,直到需要调用UpdateBox:
public class CameraThread
{
private:
Form1^ form;
public:
CameraThread(Form1^ form)
{
// constructor
this->form = form;
}
void DoSomething
{
// call UpdateBox on Form1
form->UpdateBox();
}
};
请注意,您正在混合两个功能强大的库,.NET Framework和boost。如果您不需要它们两者,您应该坚持使用一个。 .NET Framework也有线程。