C++ 如何将对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 }

我正在尝试从另一个线程上运行的另一个类更新Winform picturebox。 我遵循的答案似乎包含了所有信息,除了如何准确地将对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线程的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;”作为转发声明。