標籤:控制 ict arc url ppa 五步 外部 功能 線程建立
程式思路是由外部的輸入輸出控制卡發出採集映像訊號,之後相機採集映像得到映像資料指標,接收映像資料指標建立成映像最後顯示到MFC對話方塊應用程式的Picture Control控制項上,同時,為了標定相機位置,在主對話方塊類CMyDlg的OnPaint函數中有對Picture Control的繪圖操作(不改變映像資料,進行畫線,畫矩形等操作)。
設計時考慮到I/O卡何時發出採集訊號或者相機何時得到映像資料指標是不確定的(不使用OnTime),同時考慮到I/O卡和相機的回呼函數與主程式之間的資料交換會更加困難(不在回呼函數裡處理結果),所以建立多線程Dectect函數,I/O卡或者相機的回呼函數僅負責向主程式發送全域的映像資料指標,調用自訂事件的SetEvent函數通知Dectect線程工作。
Dectect線程獲得映像資料指標之後無法直接調用CMyDlg的OnPaint函數,Invalidate和Updatedata等函數。
採用自訂訊息的方式間接實現功能。將來在工作中肯定會遇到更多的此類情況。實現分為下列七個步驟。
第一步:在stdafx.h增加一個自訂訊息宏
#define WM_USER_POSTINVALIDATE WM_USER+500
第二步:在MyDlg.h中聲明一個public類型的成員函數(聲明我們自己定義訊息的處理函數)
afx_msg LRESULT MyMessage(WPARAM wParam, LPARAM lParam);
第三步:在CMyDlg類(MyDlg.cpp)的 BEGIN_MESSAGE_MAP(CEE8000Dlg, CDialog) 和 END_MESSAGE_MAP()之間(即類的訊息映射表)中添加自訂訊息的映射項
ON_MESSAGE(WM_USER_POSTINVALIDATE,MyMessage)
第四步:在CMyDlg類的實現檔案MyDlg.cpp中添加自訂訊息的處理函數
LRESULT CMyDlg::MyMessage(WPARAM wParam, LPARAM lParam){ }
第五步:之前操作增加的自訂訊息函數的目的是為了可以在Dectect線程中調用PostMessage函數,PostMessage作用是將一個指定的訊息寄送到指定視窗建立的線程(視窗控制代碼)的訊息佇列中。訊息已有,接下來需要在Dectect中獲得主對話方塊的視窗控制代碼。
1、得到主對話方塊的視窗控制代碼。常規問題,在CMyDlg的OnInitDialog函數中添加
CWnd *pMainWnd=AfxGetMainWnd(); HWND hMainWnd=pMainWnd->GetSafeHwnd();
2、將hMainWnd添加到Dectect。比較麻煩,初始嘗試把hMainWnd定義成全域變數,調試運行發現hMainWnd在OnInitDialog中正確賦值,運行到Dectect線程函數值就又變為NULL。還嘗試在Dectect函數中
CWnd *pMainWnd=AfxGetMainWnd(); //錯誤方法 HWND hMainWnd=pMainWnd->GetSafeHwnd(); //錯誤方法
調試結果運行到Dectect線程函數hMainWnd就又變為NULL。正確的方法又要回到Dectect線程的建立過程中去。
3、Dectect線程建立函數
HANDLE hThreadDectect=CreateThread(NULL,NULL,&Dectect,NULL,NULL,&dwThreadId1); //錯誤方法
修改後的Dectect線程建立函數
HANDLE hThreadDectect=CreateThread(NULL,NULL,&Dectect,hMainWnd,NULL,&dwThreadId1);//正確,第四個參數將hMain作為參數傳入回呼函數
經過這樣3步就將主對話方塊的視窗控制代碼傳遞到Dectect線程中了。
第六步:Dectect線程映像資料處理操作完成之後向主對話方塊線程寄送完成訊息,我的程式中相當於通知主對話方塊進行重繪操作。Dectect線程函數的合適位置:
PostMessage((HWND)pParam,WM_USER_POSTINVALIDATE,0,0); //pParam就是CreateThread中傳遞到Dectect的視窗控制代碼
第七步:在第四步的函數實現部分中可以直接調用CMyDlg的OnPaint函數,Invalidate和Updatedata等函數了。
記錄的自我感覺很詳細,方便以後再查閱。同時歡迎各位大神多提寶貴意見。
原文連結:MFC子線程更改映像資料後更新主視窗映像顯示方法
參考文獻:MFC新線程式控制制進度條
[轉]MFC子線程更改映像資料後更新主視窗映像顯示方法