读书人

多线程与消息机制,该怎么解决

发布时间: 2012-04-20 15:27:03 作者: rapoo

多线程与消息机制
基于单文档的MFC程序中,主视图类中启动一个子线程。
其中一对话框类向主视图类发送自定义消息,再由主视图类转发消息给子线程。
想请教:为什么主视图类转发的自定义消息在子线程中接收不到?

[解决办法]
对线程发消息用PostThreadMessage
[解决办法]
CWinThread::PostThreadMessage()
[解决办法]
知道线程的id,就可以向线程发线程消息
线程得有GetMessage循环
[解决办法]
线程可以多次接收到消息和自定义消息。
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
和一般窗口消息一样。

探讨

引用:

知道线程的id,就可以向线程发线程消息
线程得有GetMessage循环

如果没有GetMessage循环就只能接收一次或者一类自定义消息?

[解决办法]

探讨

引用:

知道线程的id,就可以向线程发线程消息
线程得有GetMessage循环

如果没有GetMessage循环就只能接收一次或者一类自定义消息?

[解决办法]
有2种方法,一种从CWinThread派生一个类,比如CMyThread,然后
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
创建线程,CMyThread *pThread = (CMyThread*)::AfxBeginThread(RUNTIME_CLASS(CMyThread),0);
-------------------------
另一种方法就是GetMessage
UINT __cdecl ThreadProc(LPVOID lParam)
{
MSG msg;
while( GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_SENDFILEDATA:
Sleep(1);
break;

case WM_RECVFILEDATA:
Sleep(1);
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

读书人网 >VC/MFC

热点推荐