如何将对Winform成员函数的引用传递给不同的线程不同的类?

时间:2013-03-03 07:30:28

标签: c++ multithreading winforms delegates c++-cli

我正在尝试从另一个线程上运行的另一个类更新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线程的图片框中显示结果。

我只是不知道如何做到这一点,并希望得到任何指导。提前谢谢/

1 个答案:

答案 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也有线程。