這篇文章主要介紹了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;
我們會用上在的強制類型轉換的方法,就可以還原參數的值。根據這三個參數就 自定主的線程函數就可以運行了。那如何通知界面線程呢。看一下自定義函數里面的這一句
新聞熱點
疑難解答