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

Posted

技术标签:

【中文标题】如何在 c++ winform 中同时运行两个函数?【英文标题】:How to run two functions simultaneously in c++ winform? 【发布时间】:2021-08-13 18:38:55 【问题描述】:

我在 c++ winform 中使用 opencv,我想使用线程在两个不同的图片框中显示我的网络摄像头。问题是当一个线程启动时另一个线程没有运行,因此其中一个图片框显示网络摄像头实时但另一个是它的静态图片。我想如果我可以同时运行两个线程启动功能,问题就可以解决,但我不知道该怎么做,或者问题只是别的。有人知道怎么做吗使用线程在这两个不同的图片框上显示实时网络摄像头? 任何帮助将不胜感激。

下面是代码

void start_picture_Box1()

    s1 = true;
    VideoCapture cap(0);
    while (s1) 
        cap >> _frame1;

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

        pictureBox1->Refresh();
        if (waitKey(1) == 27) 
            break;
        
    


void start_picture_Box2()

    s2 = true;
    VideoCapture cap1(0);
    while (s2) 
        cap1 >> _frame2;

        mat2picture bimapconvert;
        this->pictureBox2->Image = bimapconvert.Mat2Bimap(_frame2);

        pictureBox2->Refresh();
        if (waitKey(1) == 27) 
            break;
        
    


public: void picture_Box1()


    pictureBox1->Invoke(gcnew System::Action(this, &MyForm::start_picture_Box1));


 public: void picture_Box2()
 
     pictureBox2->Invoke(gcnew System::Action(this, &MyForm::start_picture_Box2));
 


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

ThreadStart^ ThreadMethod1 = gcnew ThreadStart(this, &MyForm::picture_Box1);
ThreadStart^ ThreadMethod2 = gcnew ThreadStart(this, &MyForm::picture_Box2);
Thread^ MyThread1 = gcnew Thread(ThreadMethod1);
Thread^ MyThread2 = gcnew Thread(ThreadMethod2);

MyThread1->Start();
MyThread2->Start();

【问题讨论】:

【参考方案1】:

这里是Invoke() 两个图片框更新,这意味着两者都在 UI 线程中同步执行。如果您需要排队,请使用BeginInvoke()。但请注意,start_picture_Box1()start_picture_Box2 都将在 UI 线程上下文中运行。

您只能从主线程更新 UI,因此您可以获得的唯一并行性是位图渲染。您必须分离渲染逻辑并将该部分仅保留在线程函数中,UI 更新应该在 UI 线程中。此外,如果您在 UI 和渲染线程之间共享数据,请确保正确的线程同步到位。

【讨论】:

因此,如果同时调用函数,为什么一个图片框显示实时网络摄像头,而另一个只是静态图片。我希望它们都显示实时网络摄像头我该怎么做解决了吗?

以上是关于如何在 c++ winform 中同时运行两个函数?的主要内容,如果未能解决你的问题,请参考以下文章

c++多线程同时运行两个函数该怎样编程啊?

C++中如何获取当前窗口句柄?

C# dll里main函数如何运行

如何在 linux 终端中同时编译和运行 c++ 代码?

如何在使用线程的c ++ winform中同时显示网络摄像头

如何使用 PlaySound() 或任何基本函数/方法在 C++ 中同时播放 1 个以上的 .wav 声音?