1

我的应用程序设置了一个工作线程,并且我正在使用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;
    }
4

1 回答 1

4

你应该使用:

#define WM_THREAD_HAS_FINISHED (WM_APP+0)

WM_USER+X是为特定窗口类而不是应用程序保留的范围。因此,如果您正在创建新的 Window 类,则只能定义此范围

看来您正在使用一个对话框,这是一个标准的,虽然没有记录,窗口类。因此,您的特定消息与此消息冲突,复制自winuser.h

#define DM_GETDEFID (WM_USER+0)

正如您可以轻松检查的那样,此消息被发送了很多。

无论如何,如果你想安全地玩,你也可以使用RegisterWindowMessage().

于 2013-07-22T15:44:54.087 回答