多开 MFC线程
序言:我才編程幾年啊!就要處理多線程。對于只寫函數的我,這難度簡直了!不過MFC的多線程,貌似比較簡單,還能處理的了。
(1).開MFC多個線程
????? 在視頻采集的過程中,如果不使用媒體計數器,會造成主線程只用于處理采集處理,主界面失去響應;
????? 多開幾個線程達到此效果.
?一: 頭文件:AviTestDlg.h
//建立參數結構體 typedef struct //傳入線程參數結構體wishchin{IplImage* TheImage; //與CAviTestDlg 同參數? wishchinCAviTestDlg* 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() {//測試代碼,按下開始追蹤,創建新線程 wishchinUpdateData(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 wishchinpMyThread->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"); //****測試代碼,為少點擊一個按鈕。。wishchinif( !(pCapture = cvCaptureFromFile(FilePath))) //argv[1] filename{fprintf(stderr, "Can not open video file %s\n", "E:\\test.avi");return -2;}}過程是這樣的:?????? 初始化參數——>初始化線程——>線程函數.
后記:使用AFX函數還是不太好的,涉及到內存問題;最后改用了BOOST函數對象,利用boost線程來實現多線程........
總結
- 上一篇: 宝可梦剑盾单首龙在哪
- 下一篇: MFC 添加文件路径 遍历文件