我的应用程序设置了一个工作线程,我正在使用PostMessage()
和一个自定义消息WM_THREAD_FINISHED
来通知主线程它已经完成执行。我正在方法OnThreadFinish()
中处理自定义消息。看起来这个方法在应用程序启动时被调用,这导致了我的问题。我遇到了崩溃,我认为这是因为a, b, or c
中没有数据。有没有理由在应用程序的初始化时调用该消息?
#define WM_THREAD_HAS_FINISHED WM_USER +0
struct DataItem {
int a;
int b;
double c;
};
....
BEGIN_MESSAGE_MAP(CProject1Dlg, CDialogEx)
....
....
ON_MESSAGE(WM_THREAD_HAS_FINISHED, &CProject1Dlg::OnThreadFinish)
END_MESSAGE_MAP()
....
UINT WorkThread( LPVOID pParam) {
// Do stuff
DataItem* m_CurrentData;
m_CurrentData->a = a;
m_CurrentData->b = b;
m_CurrentData->c = c;
// End thread, notify main thread of completion
PostMessage(hwnd, WM_THREAD_HAS_FINISHED, (WPARAM) m_CurrentData, 0);
AfxEndThread(0);
return 0;
}
LRESULT CProject1Dlg::OnThreadFinish(WPARAM wParam, LPARAM lParam) {
// Retrieve data from thread
std::auto_ptr<DataItem> currentData(reinterpret_cast<DataItem*>(wParam));
int a = currentData.a;
int b = currentData.b;
double c = currentData.c;
// Do stuff
return 0;
}
答案 0 :(得分:4)
您应该使用:
#define WM_THREAD_HAS_FINISHED (WM_APP+0)
WM_USER+X
是为特定窗口类而不是应用程序保留的范围。因此,如果要创建新的Window类
您似乎正在使用Dialog,这是一个标准的,尽管没有文档的窗口类。因此,您的特定邮件会与winuser.h
#define DM_GETDEFID (WM_USER+0)
正如您可以轻松查看的那样,此消息会被发送很多。
无论如何,如果你想安全地玩,你也可以使用RegisterWindowMessage()
。