多线程与消息机制

styeee 2012-03-12 04:47:45
基于单文档的MFC程序中,主视图类中启动一个子线程。
其中一对话框类向主视图类发送自定义消息,再由主视图类转发消息给子线程。
想请教:为什么主视图类转发的自定义消息在子线程中接收不到?
...全文
327 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahaiI0 2012-03-22
  • 打赏
  • 举报
回复
有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;
}
styeee 2012-03-22
  • 打赏
  • 举报
回复
是将该消息处理的语句放在线程中的run函数是吗?小妹初学者,还望多指教.


[Quote=引用 7 楼 tixisong 的回复:]

线程可以多次接收到消息和自定义消息。
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
和一般窗口消息一样。

引用 6 楼 styeee 的回复:

引用 4 楼 ouyh12345 的回复:
……
[/Quote]
chenkuan9zl 2012-03-15
  • 打赏
  • 举报
回复

[Quote=引用 6 楼 styeee 的回复:]

引用 4 楼 ouyh12345 的回复:

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

如果没有GetMessage循环就只能接收一次或者一类自定义消息?
[/Quote]
首先你必须让自己的线程变成UI线程,这个线程才会有消息队列 只要调用了CreateWIndow 或者GetMessage系统就会分配消息队列给该线程,消息队列都没有怎么接受消息
tixisong 2012-03-15
  • 打赏
  • 举报
回复
线程可以多次接收到消息和自定义消息。
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
和一般窗口消息一样。

[Quote=引用 6 楼 styeee 的回复:]

引用 4 楼 ouyh12345 的回复:

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

如果没有GetMessage循环就只能接收一次或者一类自定义消息?
[/Quote]
styeee 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ouyh12345 的回复:]

知道线程的id,就可以向线程发线程消息
线程得有GetMessage循环
[/Quote]
如果没有GetMessage循环就只能接收一次或者一类自定义消息?
styeee 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualeleven 的回复:]

CWinThread::PostThreadMessage()
[/Quote]
线程是主视图的一个成员函数,在主视图中转发由对话框类发过来的消息。
this->m_pGpsThread->PostThreadMessage(WM_FEATURE,NULL,NULL);
ouyh12345 2012-03-14
  • 打赏
  • 举报
回复
知道线程的id,就可以向线程发线程消息
线程得有GetMessage循环
styeee 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

对线程发消息用PostThreadMessage
[/Quote]
是用PostThreadMessage给线程发消息的,可不知道为什么收到,不知道与窗口拆分有没有关系,因为题目中的对话框类不是由主视图类产生的,而是拆分窗口产生的。
Eleven 2012-03-12
  • 打赏
  • 举报
回复
CWinThread::PostThreadMessage()
ouyh12345 2012-03-12
  • 打赏
  • 举报
回复
对线程发消息用PostThreadMessage

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧