代码之家  ›  专栏  ›  技术社区  ›  Swiss Frank

为什么PostThreadMessage()只提供未列出的错误消息error\u message\u SYNC?

  •  0
  • Swiss Frank  · 技术社区  · 7 年前

    在必须实时处理用户事件的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;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Swiss Frank    7 年前

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

    #define MATHTHREAD_PROC ( WM_USER + 1 )