多开 MFC线程

来源:互联网 发布:公安局网络诈骗案 编辑:程序博客网 时间:2024/06/05 14:54

(1).开MFC多个线程

      在视频采集的过程中,如果不使用媒体计数器,会造成主线程只用于处理采集处理,主界面失去响应;

      多开几个线程达到此效果.

 一: 头件:AviTestDlg.h

    //建立参数结构体typedef struct                       //传入线程参数结构体wishchin   {    IplImage*                 TheImage;           //与CAviTestDlg 同参数? wishchin    CAviTestDlg*              dlg;                    //与主对话框成为友元 wishchin    }lparameter,lparameter2 , *lpParam;                          //生成参数结构体   //类内设置友元,声明全局线程为友元class CAviTestDlg : public CDialog   {  public:    friend UINT CPicThreadInfo(lpParam lp);//线程设置为友元,为使线程访问主对话框函数及变量    friend UINT CPicThreadInfo2(lpParam lpFuc);   }

二:源码件 AviTestDlg.cpp

  //添加全局线程  UINT CPicThreadInfo(lpParam lp); //在按下控件后,创建线程 void CAviTestDlg::OnBnClickedTraceStart(){    //测试代码,按下开始追踪,创建新线程  wishchin    UpdateData(TRUE);    ///////////////////////////////////////////    //初始化参数。。。    lpParam lp=new lparameter;    lp->TheImage     =TheImage;    lp->dlg           =this;    StartCapture(lp);//调用开始捕捉函数}//开始捕捉函数void CAviTestDlg::StartCapture(lpParam lp){    vector<CWinThread*>  handle;    //////////////////////////    lpParam parameter=new lparameter;     ///////////////////////// 初始化参数列表   在线程函数内部初始化 可以?wishchin            parameter->TheImage    =lp->TheImage ;    parameter->dlg                 =lp->dlg;    ///////////////////////////////////////////////////////////////////    CWinThread *pMyThread=AfxBeginThread(AFX_THREADPROC(CPicThreadInfo),parameter);  ////创建线程函数CPicThreadInfo wishchin    pMyThread->m_bAutoDelete=FALSE;    pMyThread->ResumeThread();    handle.push_back(pMyThread);  //用向量来容纳线程, 真正地开始创建线程 }//线程函数UINT CPicThreadInfo(lpParam lp)   {    IplImage*              TheImage      =lp->TheImage ;    CAviTestDlg*         dlg                  =lp->dlg;    /////////////////////////////////////////////////////////////////    //打开视频件    CvCapture* pCapture=cvCaptureFromFile("C:\\test.avi");    //****测试代码,为少点击一个按钮。。wishchin    if( !(pCapture=cvCaptureFromFile(FilePath)))              //argv[1] filename      {        fprintf(stderr, "Can not open video file %s\n", "E:\\test.avi");        return -2;       }  }
过程是这样的:

       初始化参数——>初始化线程——>线程函数.

后记:使用AFX函数还是不太好的,涉及到内存问题;最后改用了BOOST函数对象,利用boost线程来实现多线程........

0 0
原创粉丝点击