【发布时间】: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