从另一个线程和类C ++更新Winform控件

时间:2013-02-24 04:26:04

标签: c++ multithreading class user-interface forward-declaration

我一直在努力尝试从另一个线程和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 ++方面拥有巨大的专业知识,所以如果这是愚蠢的话我会道歉。

1 个答案:

答案 0 :(得分:0)

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

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

这是应该如何组织的。