我一直在努力尝试从另一个线程和 C++ 中的另一个类更新 Winform 控件。我看到关于这个主题的几个问题,但每个问题在某种程度上似乎都不完整,我无法解决缺失的部分。
我的 Winform 线程有一个图片框。我有一个单独的类,它在一个单独的线程上运行,该线程从网络摄像头捕获图像,处理它们,然后我想在图片框中的 Winform 线程上显示图像。我正在使用 VS2010 SE C++。
我的代码如下:
//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 方法。当我编译上面的代码时,我收到一个错误,指的是一个“const”,CameraThread 绑定到声明一个指向 Form1 的指针。我认为 Form1 的前向声明会处理这个问题,但显然不是。我的问题似乎是每个使用单独的线程和类从 GUI 线程执行重要工作的人都会遇到的问题,所以我希望我的问题会提示一个可以被其他人用作模板的响应。我对多线程比较陌生,也没有声称在 C++ 方面拥有丰富的专业知识,所以如果这是愚蠢的事情,我深表歉意。