[轉]MFC子線程更改映像資料後更新主視窗映像顯示方法

來源:互聯網
上載者:User

標籤:控制   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子線程更改映像資料後更新主視窗映像顯示方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.