1

我一直在努力尝试从另一个线程和 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++ 方面拥有丰富的专业知识,所以如果这是愚蠢的事情,我深表歉意。

4

1 回答 1

0

您使用不同的类这一事实并不重要。这就是您组织代码的方式。您可以将所有内容放在一个类中,创建 10 个类,等等。目标是逻辑地组织您的代码。

您不能从任何不同的线程对 UI 线程中使用的对象/数据字段进行任何操作。这行不通。这是完全错误的。在您的工作线程的堆上分配数据,PostMessage使用指向此数据的指针调用,在您的 UI 线程(直接在您的表单中)获取您的数据,处理并释放此数据。

这就是它应该组织的方式。

于 2013-02-24T05:53:20.977 回答