1. 程式人生 > >子執行緒PostThreadMessage發訊息PreTranslateMessage接收不到

子執行緒PostThreadMessage發訊息PreTranslateMessage接收不到

建立一個MFC基於對話方塊工程:

CMFCApplication1Dlg和CMyThread類:

按鈕
 

UINT mainThreadID;
void CMFCApplication1Dlg::OnBnClickedOk()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	 mainThreadID = GetCurrentThreadId();
	m_pThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
	SetTimer(0,500,NULL);
	//CDialogEx::OnOK();
}
BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此新增專用程式碼和/或呼叫基類
	
	if (pMsg->message == WM_NUM)
	{
		CTime ctime = CTime::GetCurrentTime(); //得到當前系統時間
		CString strTime = ctime.Format("%H:%M:%S");
		SetDlgItemText(IDC_TIME, strTime); //送到指定控制元件
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}

執行緒函式:

BOOL CMyThread::InitInstance()
{
	// TODO:    在此執行任意逐執行緒初始化
	
	bool ret = ::PostThreadMessage(mainThreadID, WM_NUM, 5,0);
	if (!ret)
	{
		AfxMessageBox(_T("失敗"));
	}
	return TRUE;
}

總結:如果在對話方塊類外(子執行緒)使用PostThreadMessage,需要定義一個全域性的變數來儲存主執行緒ID,以便傳入PostThreadMessage第一個引數,還有一個原因是,訊息佇列並沒有建立,所以系統根本就收不到該訊息。

參考:

https://www.cnblogs.com/LJWJL/p/3871073.html

https://blog.csdn.net/zac_sian/article/details/47110041

https://zhidao.baidu.com/question/204729752.html

https://blog.csdn.net/mos2046/article/details/39490595