【问题标题】:Is it possible to make a thread inside another thread in MFC?是否可以在 MFC 中的另一个线程内创建一个线程?
【发布时间】:2015-06-25 17:25:06
【问题描述】:

我在使用 opencv 的 MFC 中遇到一个关于线程的问题。让我先描述一下我的问题。我有一个用于显示来自摄像机的视频帧的 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;

【问题讨论】:

  • 当然可以在线程中创建线程。当你创建你的第一个线程时,你认为你在做什么?你的程序在它自己的线程中运行,而你又派生出另一个线程来做其他事情。
  • @NathanOliver:实际上,我必须控制每秒不同帧的视频显示。因为图像处理需要一些时间,因此我需要显示一个窗口是原始帧(看起来像实时由于没有图像处理),第二个窗口是图像处理,它可以有一些延迟。因此,第一个窗口看起来像真实的图像帧。第二个窗口是图像处理。
  • 你必须小心不要从创建它的线程访问一个窗口,这有点禁忌。
  • 我认为您不需要线程(或者更确切地说,另一个线程)来从相机获取图像。不过,在后台线程中执行一些操作可能是有意义的。无论如何,您的假设可能是错误的,这就引出了您的实际问题是什么的问题。
  • 个人我不喜欢你的线程永远循环,它让我担心如何优雅地终止,(即从你的主线程)我也不喜欢 MFC 的线程自动删除,但这可能只是我太……

标签: c++ multithreading opencv visual-studio-2012 mfc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多