多开 MFC线程
序言:我才编程几年啊!就要处理多线程。对于只写函数的我,这难度简直了!不过MFC的多线程,貌似比较简单,还能处理的了。
(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线程来实现多线程........