1

アプリケーションにワーカー スレッドを設定しPostMessage()、カスタム メッセージを使用しWM_THREAD_FINISHEDてメイン スレッドに実行が終了したことを通知しています。method でカスタム メッセージを処理しています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 クラスを作成する場合にのみ、この範囲を定義できます

文書化されていませんが、標準のウィンドウ クラスである Dialog を使用しているようです。したがって、特定のメッセージは、からコピーされた次のメッセージと衝突しますwinuser.h

#define DM_GETDEFID (WM_USER+0)

そして、簡単に確認できるように、このメッセージは大量に送信されます。

とにかく安全にプレイしたい場合は、 を使用することもできますRegisterWindowMessage()

于 2013-07-22T15:44:54.087 に答える