C++ 關於MFC多線程編程的留意事項。本站提示廣大學習愛好者:(C++ 關於MFC多線程編程的留意事項)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 關於MFC多線程編程的留意事項正文
在多線程編程中,最簡略的辦法,不過就是應用 AfxBeginThread 來創立一個任務線程,看一下這個函數的解釋:
CWinThread* AFXAPI AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
在這個解釋中,除第1和第2兩個參數外,余下的參數都有默許值。所以,我們在應用的時刻,是必需要指定前兩個參數的。
個中 第一個參數是 要運轉的函數的稱號,光寫函數名便可以了,不克不及加引號。
第二個參數,是指定 運轉函數的 參數,這個參數的類型為 LPVOID 。所以要運轉的函數的在傳遞曩昔後,要轉化為LPVOID類型才可以。
而要運轉的參數還有一個限制,那就是必需前往一個UINT類型的成果。所以要運轉的函數的就有一個根本上固定的格局。
UINT RunProce(LPVOID lpParam)
在這裡還須要特殊解釋一下,這個函數不克不及是實例函數,也就是函數後面是不克不及有 類限制符:: 的。假如是靜態函數也是可以的。
在這個函數中,我們只能應用一個參數,而參數的類型只能是 LPVOID ,可以用一個構造體來關閉多個參數。
余下的成績,就不是許多了。
關於 多線程,就寫到這裡吧!
在多線程編程中,一個很主要的成績就是,要將線程的運轉進程告訴界面線程,做一些顯示方面的更新。以下載線程,在恰當的時刻,可以更新界面,如今下載到甚麼進度了。等等的情形。然則在任務線程中,是否是直接操作界面線程的控件的。那怎樣辦呢,只能經由過程自界說一個新聞來處理。
任務流程,就是 在自界說線程中 經由過程發送一個界面上的 新聞,來告訴界面做一些更新操作。在這個自界說新聞中,有一個細節要處理,那就是自界說新聞,必需要指定吸收新聞的控件句柄。固然你中以應用m_pApp 直接告訴主框架來處理,然則如許處理仿佛繞了一個很年夜的圈。其實處理的辦法很簡略,那就是直接將吸收新聞的控件的句柄傳給自界說線程,便可以了。我們直接在線程中應用此句柄便可以處理了。
我們曉得控件的基類都是 CWnd。所以我們傳遞一個CWnd的指針出來。固然還有一些其它的參數要一塊傳遞出來,那就做一個構造吧
typedef struct{
CString srcString;
CString DesString;
CWnd* hander;
}Param;
這裡我們傳遞了三個參數 兩個字符串一個指針。
我們先造一個自界說線程函數
UINT RunProce(LPVOID lpParam)
{
Param* par;
CWnd* hander;
par = (Param*)lpParam;
hander = par->hander;
myCopyDirectory(lpParam);
CString str;
str = "復制完成";
hander->SendMessage(WM_USERMESSAGE,0,(LPARAM)&str);
return 0;
}
在這個函數中,我們要運轉由此函數構成的一個線程的話,就須要傳遞一個參數lpParam,而這個參數是由 Param 的構造體來指定。現實上是傳遞了三個參數出來。
Param* par;
par = (Param*)lpParam;
我們會用上在的強迫類型轉換的辦法,便可以復原參數的值。依據這三個參數就 自定主的線程函數便可以運轉了。那若何告訴界面線程呢。看一下自界說函數外面的這一句
hander->SendMessage(WM_USERMESSAGE,0,(LPARAM)&str);
這一句中 hander 是由構造體轉換而來的 吸收新聞的控件的句柄。然後挪用這個控件的 SendMessage 辦法,便可以向此控件發新聞了。新聞的內容由前面的參數來決議
第一個參數 WM_USERMESSAGE 這是一個新聞的稱號。這個稱號現實上是一個數字。我們須要在 .h 文件中 指定一下以下面的格局
#define WM_USERMESSAGE 11130
前面的數字造的年夜一點,哈哈
第二個與第三個參數,就是這個新聞傳遞詳細的值,假如不須要傳遞值的話,那就直接寫0吧
在這裡我們想在傳遞參數的第三個參數上傳遞一個 字符串,那就是下面的寫法了。
如許的話,在線程中發送新聞的部門,就全體講完了。新聞發送出去了,怎樣吸收呢?
這真是一個主要的成績
起首,要將新聞做一下映照。新聞映照的目標,就是告知法式,當湧現這個新聞的時刻,應用哪一個函數停止處置。如許的話,就起首須要一個新聞映照的函數。這個新聞映照的函數不是亂寫,由於要傳遞兩個參數,所以這個函數須要可以或許吸收這兩個參數。處置函數普通如許子寫
LRESULT CCopyfileDlg::OnProcName(WPARAM wParam, LPARAM lParam)
他奶奶的,太奇異了。前往值只能是 LRESULT 。這個不消評論辯論吧,照著抄吧。函數稱號前面有參數兩個,這是一個實例函數。由於後面有::
兩個參數普通也寫成這個模樣的。
函數內容,就由你的法式的功效決議了。我這裡直接抄一段我本身的代碼吧
LRESULT CCopyfileDlg::OnProcName(WPARAM wParam, LPARAM lParam) { // TODO: 處置用戶自界說新聞 CString* str = (CString*)lParam; SetDlgItemText(IDC_STATIC,*str); if(*str == "復制完成") { (CButton*)GetDlgItem(IDC_COPYBUT)->EnableWindow(true); } return 0; }
這段法式是依據獲得的傳遞過去的參數,在界面上顯示詳細的參數內容。
SetDlgItemText(IDC_STATIC,*str); //在靜態文本框中顯示新聞。
備注:
假如要讓按鈕釀成灰色的,那就應用控件的 EnableWindow 辦法。
這個辦法,我們說,是專門的新聞處置函數,那末它的聲明也比擬特別。須要這麼寫
afx_msg LRESULT OnProcName(WPARAM wParam, LPARAM lParam);
將下面的內容放在 h文件的公道地位便可以了。
如今新聞處置函數也有了。然則怎樣將映照呢?
其其實 CPP文件中,有一個由 BEGIN_MESSAGE_MAP(CCopyfileDlg, CDialog) 和END_MESSAGE_MAP() 包含的區域。這個區域就是用來界說新聞映照的。
將這麼一句話放在他們中央,就OK了
ON_MESSAGE(WM_USERMESSAGE,OnProcName)
這麼一句話,就將 WM_USERMESSAGE 與 OnProcName 與新聞處置函數聯合在一路了。是否是超等簡略呀!
如許我們的界面線程中的新聞處置部門也主做好了。
當新聞發送過去後,就會經由過程新聞映照放在對應的函數中加以處置。
以上所述就是本文的全體內容了,願望年夜家可以或許愛好。