项目遇到的问题, 解决了但是时间紧张的原因 , 没有仔细考虑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 为什么就能得到影响??? 此时也没有进行消息循环。
{
.
// 阻塞操作
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 为什么就能得到影响??? 此时也没有进行消息循环。
解决方案 »
- 控件子类的消息问题
- 兼容DC怎样理解啊?你们是怎样理解的?
- MFC中如何将图片缩放(100分)
- 什么程度,才算是了解或熟悉TCP/IP
- 求一解决方案~~~~~由于这个不好从google搜索,并且我经验没有所以无从下手
- 1000分的问题!!VC网络截取、分析数据包有什么开发库吗?解决后再开9个百分贴倒分!!!!!
- 怎样才能截住WINDOWS发给菜单的消息WM_COMMAND啊?我用WH_CALLWNDPROC?能够取道WM_MENUSELECT消息
- CDialog变量问题
- 我只能给25分,帮忙,十万火急
- 程序员应具备的素质 —— 大家发表自己得意见。
- 加入组播问题
- http://community.csdn.net/网叶怎么老是去自动覆屏幕
消息循环的作用是让程序在消息中等待,如果没有消息循环程序就直接退出了。
但是在 workerThread 中给主窗口线程发送的消息确实是得不到处理(在对应消息的 case 下设置断点不能被触发, 如果在 workerThread 换成用 SendMessage 发送就会因消息得不到处理而进入阻塞状态).
您上面所说的不能解析这种情况.
难道和发送消息操作所在的线程有关?
我再试试!!
换言之,PostMessage需要DisPatchMessage才能奏效,而SendMessage则不需要。
2.Post和Send机制不一样.Post只负责把消息放到队列中,然后就立即返回.Send会等待处理完成再返回.但同样需要消息循环.
3.对应的caase下断点不能被触发.....如果另一个消息在处理中.后来的消息只能等待前一个消息处理完成.和Send被阻塞的道理一样.
最后,你的代码不完整.很难说是哪里出了问题:
1.同步对象什么时候创建的???
2.窗口什么时候创建的???
3.线程什么时候创建的???
4.do something 里面会持续多久??还是根本就是一个不会返回的执行体????
winmain 中在消息派遣进行之前 发送的消息 WM_MAINXXX 为什么就能得到影响??? 此时也没有进行消息循环。
-------------------------------------------------------------------------------------------
当线程调用SendMessage给本线程拥有的窗体发送消息的时候
也就是说调用SendMessage的线程负责执行指定窗体的处理函数
这样就会直接调用窗体处理函数(在注册窗口类时指定的)还有就是工作线程里发送的消息,我觉的如果PostMessage时g_hMainWnd所对应的窗体已正确创建的话,这个消息应该是可以被响应的
比较简单的问题,只是为了深入的了解 windows 消息循环机制 ,向大家学到了不少的知识, 谢谢了。