子執行緒PostThreadMessage發訊息PreTranslateMessage接收不到
阿新 • • 發佈:2018-11-28
建立一個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