如何在 c++ winform 中的线程之间传递数据?

Posted

技术标签:

【中文标题】如何在 c++ winform 中的线程之间传递数据?【英文标题】:how to pass data between threads in c++ winform? 【发布时间】:2021-08-17 21:05:54 【问题描述】:

在这个程序中,我想用一个线程捕获我的网络摄像头的帧,然后将这些帧发送到另一个名为 MainThread 的帧,并在图片框中显示网络摄像头

所以我想将捕获的帧 (_frame1) 从 capture_frame_1_Thread 传递到 MainThread。 有什么想法吗?

这里是代码

    VideoCapture cap1(0);
    Mat _frame1;

    void capture_frame_1() 
    for (;;) 
        cap1 >> _frame1;

        if (waitKey(1) == 27) 
            break;
        
    


void invoke_capture_frame_1() 
    Invoke(gcnew System::Action(this, &MyForm::capture_frame_1));


void start_picture_Boxes() 
    for (;;) 

        mat2picture bimapconvert;
        this->pictureBox1->Image = bimapconvert.Mat2Bimap(_frame1);

        pictureBox1->Refresh();

        if (waitKey(1) == 27) 
            break;
        
    


void picture_Boxes() 
    Invoke(gcnew System::Action(this, &MyForm::start_picture_Boxes));




private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)

ThreadStart^ ThreadMethod1 = gcnew ThreadStart(this, &MyForm::invoke_capture_frame_1);
Thread^ capture_frame_1_Thread = gcnew Thread(ThreadMethod1);

ThreadStart^ ThreadMethod3 = gcnew ThreadStart(this, &MyForm::picture_Boxes);
Thread^ MainThread = gcnew Thread(ThreadMethod3);

capture_frame_1_Thread->Start();
MainThread->Start();



;

【问题讨论】:

【参考方案1】:

您可以创建一个名为 webcam 的类,并拥有这些方法。然后你可以有一些方法来启动线程 webcam.startThreads();。 然后你可以创建一个叫做frame的私有变量,这样你就可以在线程之间共享,但不要忘记使用锁来消除竞争条件。 锁信息https://www.cplusplus.com/reference/mutex/mutex/lock/

希望对你有帮助,我在制作网络过滤器时使用了这个结构。

【讨论】:

考虑在答案中添加示例代码

以上是关于如何在 c++ winform 中的线程之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c++ winform 中同时运行两个函数?

C# winform 跨线程操作winform程序窗体

在线程之间传递信息的最佳方式是啥?

如何在 C++ 中的 unordered_map 的并发读取和锁定单线程写入之间交替

Winforms C#在表单之间传递变量[重复]

如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容