0

我正在尝试从另一个线程上运行的另一个类更新 Winform 图片框。我从另一个线程 _and_ 类中遵循 Update WinForm Controls 的答案,该类似乎具有所有信息,除了如何准确地将 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 线程上的图片框中显示结果。

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

4

1 回答 1

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

于 2013-03-03T07:44:37.810 回答