目錄
- 概述
- 自定義消息執行個體
-
- 1 Dialog設計
- 2 主線程設計
- 次線程設計
- 參考資料
概述
線程間通信有兩種方法
- 使用全局變量
- 使用自定義消息
自定義消息執行個體
主線程向CCalculateThread線程發送WM_CALCULATE消息,CCalculateThread線程處理後向主線程發送WM_DISPLAY消息。
1 Dialog設計
- 添加三個單選按鈕Radio Button IDC_RADIO1,IDC_RADIO2,IDC_RADIO3,标題命名為10,50,100。
- 添加Button按鈕。命名為SUM,ID為IDC_SUM
- 添加編輯框Edit Control。
2 主線程設計
- 頭檔案中添加變量:int nAddend,代表加數的大小。
- 分别輕按兩下三個單選按鈕,添加消息響應函數:
void CMultiThread7Dlg::OnBnClickedRadio1()
{
// TODO: Add your control notification handler code here
nAddend=10;
}
void CMultiThread7Dlg::OnBnClickedRadio2()
{
// TODO: Add your control notification handler code here
nAddend=50;
}
void CMultiThread7Dlg::OnBnClickedRadio3()
{
// TODO: Add your control notification handler code here
nAddend=100;
}
- 并在OnInitDialog函數中完成相應的初始化工作
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
nAddend=10;
- 頭檔案中聲明消息映射宏
#define WM_DISPLAY WM_USER+2
為了防止使用者定義的消息ID與系統的消息ID沖突,MS定義了一個宏WM_USER,小于WM_USER 的ID被系統使用,大于WM_USER的ID被使用者使用
- 添加消息映射
ON_MESSAGE(WM_DISPLAY,OnDisplay)
- 設計消息響應函數
LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam,LPARAM lParam)
{
int nTemp=(int)wParam;
CString strTime;
strTime.Format(_T("%d"),nTemp);
::SetDlgItemText(AfxGetApp()->m_pMainWnd->GetSafeHwnd(),IDC_EDIT,strTime);
return 0;
}
此處如果使用strTime.Format(("%d"),nTemp),可能會出現錯誤:沒有與清單參數比對的重載函數,因為字元串有兩種類型,char和wchar_T,分别用于多位元組字元和unicode字元,兩者分别有各自的字元串處理函數。
- 輕按兩下SUM:
void CMultiThread7Dlg::OnBnClickedSum()
{
// TODO: Add your control notification handler code here
m_pCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
Sleep(500);
m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
}
次線程設計
- 添加類,父類為CWinThread,類名為CCalculateThread。
- 頭檔案中聲明消息映射宏
#define WM_CALCULATE WM_USER+1
- 添加消息映射
ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
ON_THREAD_MESSAGE指明由哪個函數來處理使用者定義的消息。當使用CWinThread類的時候,必須用ON_THREAD_MESSAGE來代替ON_MESSAGE。使用者定義的消息是指那些不屬于标準的Windows WM_MESSAGE的消息。對于每一個要映射到消息處理函數的使用者定義函數,在消息映射中必須有且隻能有一個ON_THREAD_MESSAGE宏語句。
- 設計消息處理函數
void CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
{
int nTmpt=0;
for(int i=0;i<=(int)wParam;i++)
{
nTmpt=nTmpt+i;
}
Sleep(500);
::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
}
參考資料
MFC多線程各種線程用法