天天看點

使用自定義消息進行線程間通信概述自定義消息執行個體次線程設計參考資料

目錄

  • 概述
  • 自定義消息執行個體
    • 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多線程各種線程用法