win32 消息循环疑惑

Blue_Dream_ 2007-10-01 10:34:33
项目遇到的问题, 解决了但是时间紧张的原因 , 没有仔细考虑

INT WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR strCommandLine, INT )
{
.
// 阻塞操作
WaitForSingleObject( g_Event , INIFINITE );
SendMessage (g_hMainWnd, WM_MAINXXX, 0, 0);
.
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}

return 0;
}

LRESULT CALLBACK MainWindowProc( HWND hwnd, UINT msg, WPARAM w, LPARAM l )
{

switch(msg)
{
case WM_THREADXXX:
// do -- something // 没有响应, 接收不到 WorkerThread 线呈发送的消息, 正常
break;

case WM_MAINXXX:
// do -- something // 当 g_Event 事件受信后, 此处可以响应 winmain 的 消息
break;
}


return DefWindowProc( hwnd, msg, w, l );
}

DWORD WINAPI WorkerThread( PVOID arg )
{

// 向主窗口线程发送消息, 此时 WinMain 中仍然处于 阻塞状态
// 如果此处换成 SendMessage, 那就不能返回了,
PostMessage (g_hMainWnd, WM_THREADXXX, 0,0);

return 0;
}

由上面的分析我可以得出:
(1) PostMessage 与 SendMessage 的不同点确实存在.
PostMessage : 只是把消息放在窗口线呈的消息对列中,不管是否被处理
SendMessage : 等消息被处理后才返回.

(2) 不能响应 WorkerThread 的 WM_THREADXXX 原因是 WinMain 还有进行消息的派遣和发送

疑惑:
winmain 中在消息派遣进行之前 发送的消息 WM_MAINXXX 为什么就能得到影响??? 此时也没有进行消息循环。
...全文
367 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Blue_Dream_ 2007-10-08
  • 打赏
  • 举报
回复
谢谢大家的回复, starwing83 说的有点道理。我考虑了这个过程, 可以解释这种情况。
比较简单的问题,只是为了深入的了解 windows 消息循环机制 ,向大家学到了不少的知识, 谢谢了。
龙凤呈祥焱 2007-10-04
  • 打赏
  • 举报
回复
1.消息队列.每个线程都有自己的消息队列,注意是线程不是窗口.
2.Post和Send机制不一样.Post只负责把消息放到队列中,然后就立即返回.Send会等待处理完成再返回.但同样需要消息循环.
3.对应的caase下断点不能被触发.....如果另一个消息在处理中.后来的消息只能等待前一个消息处理完成.和Send被阻塞的道理一样.
最后,你的代码不完整.很难说是哪里出了问题:
1.同步对象什么时候创建的???
2.窗口什么时候创建的???
3.线程什么时候创建的???
4.do something 里面会持续多久??还是根本就是一个不会返回的执行体????
拿节 2007-10-04
  • 打赏
  • 举报
回复
疑惑:
winmain 中在消息派遣进行之前 发送的消息 WM_MAINXXX 为什么就能得到影响??? 此时也没有进行消息循环。
-------------------------------------------------------------------------------------------
当线程调用SendMessage给本线程拥有的窗体发送消息的时候
也就是说调用SendMessage的线程负责执行指定窗体的处理函数
这样就会直接调用窗体处理函数(在注册窗口类时指定的)

还有就是工作线程里发送的消息,我觉的如果PostMessage时g_hMainWnd所对应的窗体已正确创建的话,这个消息应该是可以被响应的



starwing83 2007-10-03
  • 打赏
  • 举报
回复
个人的理解,PostMessage是将消息放到队列中,而SendMessage则是将消息处理函数当作一个子程序来调用,写SendMessage(hWnd,...);就象直接写WndProc(hWnd,...);直接调用,所以不需要管消息循环.而DispatchMessage则是将消息队列和消息函数联系在了一起,使用相应处理函数去处理消息。
换言之,PostMessage需要DisPatchMessage才能奏效,而SendMessage则不需要。
Blue_Dream_ 2007-10-01
  • 打赏
  • 举报
回复
谢谢您得回答, 本来如果按原理来说是这样。
但是在 workerThread 中给主窗口线程发送的消息确实是得不到处理(在对应消息的 case 下设置断点不能被触发, 如果在 workerThread 换成用 SendMessage 发送就会因消息得不到处理而进入阻塞状态).
您上面所说的不能解析这种情况.
难道和发送消息操作所在的线程有关?
我再试试!!
yxz_lp 2007-10-01
  • 打赏
  • 举报
回复
窗口注册的时候,就指定了窗口处理函数MainWindowProc,这个函数是由os调用,任何发送给这个窗口的消息,os都会捕获,并交由MainWindowProc处理,和有没有消息循环没有关系。
消息循环的作用是让程序在消息中等待,如果没有消息循环程序就直接退出了。

15,979

社区成员

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

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