【问题标题】:Why is PostThreadMessage() giving me an unlisted error message ERROR_MESSAGE_SYNC_ONLY?为什么 PostThreadMessage() 给我一个未列出的错误消息 ERROR_MESSAGE_SYNC_ONLY?
【发布时间】:2018-08-22 14:16:44
【问题描述】:

在必须实时处理用户事件的 MFC 应用程序中,会创建一个子线程来执行一些冗长的数学处理。但是,向其发送消息会导致错误 1159,winerror.h 显示为 ERROR_MESSAGE_SYNC_ONLY。为什么?

线程创建:

#define MATHTHREAD_PROC ( 1 )

hMathThread = CreateThread( 0, 0, MathThreadProc, this, 0, &dwMathThreadID );
if( !hMathThread )
    printf( "Math CreateThread() fail\n" );

线程信号:

if ( !PostThreadMessage( dwMathThreadID, MATHTHREAD_PROC, NULL, 0 ) ) {
    DWORD dwError = GetLastError();
    printf( "PostThreadMessage() for math thread: %d\n", dwError );
}

线程代码:

static DWORD WINAPI MathThreadProc( LPVOID pvUserData ) {

    return ( (MyClass*) pvUserData )->MathThread();
}

DWORD MyClass::MathThread() {

    MSG msg;
    int iRV;

    // https://msdn.microsoft.com/en-us/library/ms644946(v=vs.85).aspx
    iRV = PeekMessage( &msg, NULL, WM_USER, WM_USER, PM_NOREMOVE );

    while ( iRV = GetMessage( &msg, 0, 0, 0 ) ) {

        if ( iRV == -1 )
            printf( "GetMessage() = -1: %d\n", GetLastError() );

        switch ( msg.message ) {

        case MATHTHREAD_PROC:
            ProcessMath();
            break;

        default:
            printf( "got math thread exit request %p\n", this );
            abort();
        }
    }

    printf( "SCGraph::MathThread(): GetMessage = WM_QUIT\n" );

    return msg.wParam;
}

【问题讨论】:

  • API 可以返回的错误消息列表并不全面。通常,该列表甚至无法确定,尤其是当 API 调用超出其控制范围的代码时。您的代码必须准备好处理未知的错误代码。
  • 显示您如何发布 MATHREAD_PROC 消息的代码。
  • 嗨,Tom,这是第二个密码 sn-p。

标签: multithreading winapi mfc


【解决方案1】:

ERROR_MESSAGE_SYNC_ONLY 表示消息低于 WM_USER。只需更改消息 ID 即可使帖子正常工作:

#define MATHTHREAD_PROC ( WM_USER + 1 )

【讨论】:

  • 您应该使用WM_APP 而不是WM_USER。阅读this SO article
  • @Jabberwocky:WM_USER 范围内没有系统定义的 thread 消息。使用WM_USER 范围内的消息调用PostThreadMessage 不会与系统定义的消息冲突。您链接到的问答完全是错误的(我已经在评论中暗示过)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多