是否可以在MFC中的另一个线程中创建一个线程

Is it possible to make a thread inside another thread in MFC?

本文关键字:线程 创建 一个 另一个 MFC 是否      更新时间:2023-10-16

我有一个关于MFC中使用opencv的线程的问题。让我先描述一下我的问题。我有一个GUI,用来显示摄像机的视频帧。因此,我必须使用一个线程从相机获取视频,并将其显示在GUI中。它完成了。然而,我想扩展我的问题,例如:当视频显示时,我想通过命令在opencv的其他窗口中显示该视频

IplImage* image2=cvCloneImage(&(IplImage)original);
cvShowImage("Raw Image", image2);
cvReleaseImage(&image2);

据我所知,我需要在线程内部创建一个新的线程,以便从相机获取视频。有可能做到吗?让我看看我的代码,你能给我一些解决方案或建议来完成这项任务吗?非常感谢

这是我的代码

THREADSTRUCT *_param = new THREADSTRUCT;
_param->_this = this;
CWinThread* m_hThread;
m_hThread = AfxBeginThread (StartThread, _param);

在StartThread函数中,我会调用来自等相机的加载视频

UINT Main_MFCDlg::StartThread (LPVOID param)
{
    THREADSTRUCT*    ts = (THREADSTRUCT*)param;
    cv::VideoCapture cap;
    cap.open(0);
    while (true)
    {
    Mat frame;
    Mat original;
    cap >> frame;
    if (!frame.empty()){
        original = frame.clone();           
        //Display video in GUI
        CDC* vDC_VIDEO;
        vDC_VIDEO=ts->_this->GetDlgItem(IDC_VIDEO)->GetDC();
        CRect rect_VIDEO;
        ts->_this->GetDlgItem(IDC_VIDEO)->GetClientRect(&rect_VIDEO);
        //Is it possible to create a thread in here to show video with other
        //delay time such as 1000ms
        //To call the function cv::imshow("Second window", original);
        }
    if (waitKey(30) >= 0) break;// Delay 30ms for first window
    }
}

注意线程结构看起来像

//structure for passing to the controlling function
typedef struct THREADSTRUCT
{
    Main_MFCDlg*    _this;
} THREADSTRUCT;

当然,您可以在线程中创建线程。你的问题是:工作线程不应该直接在UI线程中访问UI对象,细节在这里解释

在工作线程中,后台作业完成后,可以使用SendMessage向GUI发送消息,并让它更新。