C++ 如何将对Winform成员函数的引用传递给不同的线程和不同的类?
我正在尝试从另一个线程上运行的另一个类更新Winform picturebox。 我遵循的答案似乎包含了所有信息,除了如何准确地将对Winform/Winform成员函数的引用传递给构造函数中的线程,以及如何从线程调用Winform成员函数 我的代码如下:C++ 如何将对Winform成员函数的引用传递给不同的线程和不同的类?,c++,multithreading,winforms,delegates,c++-cli,C++,Multithreading,Winforms,Delegates,C++ Cli,我正在尝试从另一个线程上运行的另一个类更新Winform picturebox。 我遵循的答案似乎包含了所有信息,除了如何准确地将对Winform/Winform成员函数的引用传递给构造函数中的线程,以及如何从线程调用Winform成员函数 我的代码如下: //Camera.h public class CameraThread { public: CameraThread(????) { // constructor }
//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线程的picturebox中显示结果
我只是不知道该怎么做,希望得到任何指导。提前感谢/您需要类中的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();
}
};
请注意,您混合了两个强大的库,.NETFramework和boost。如果你两个都不需要,你应该选择其中一个。.NET Framework也有线程。您可能应该事先明确说明您使用的是C++/CLI而不是(ISO)C++:这将帮助您为您的问题找到合适的受众。谢谢。对于你的评论,我做了一些阅读,你是绝对正确的。我看到很多类似于我这样的noobs的评论,这似乎是一个反复出现的问题。也许它已经存在了,但它可能是有意义的,所以考虑添加一些问题的脚本,这表明海报,以避开无知的问题,如我的。再次感谢,谢谢。它仍然没有编译,并且如上所述给了我一个错误(“语法错误丢失”;“^”之前的“^”)。我假设这是因为Camera.h在Form1.h之前处理,编译器不知道“Form1”是什么。放入前向声明(“类Form1;”)只会将错误更改为(“语法错误”常量)。再次感谢您的帮助。使用C++/CLI,您可能需要“ref class Form1;”作为转发声明。