拜读了网上一些与PostMessage相关的文章,我了解到当广播消息到多个窗口时,有可能一些窗口会简单地忽略该消息。但假如我向某一指定窗口(比如PostMessage(m_hSuperviseWnd,WM_INSERT_CHANNEL,(WPARAM)pDisplayInfo,0);其中m_hSuperviseWnd是窗口句柄,WM_INSERT_CHANNEL是自定义的消息,pDisplayInfo是所要传递的指针参数)发送消息时,不知是不是也有可能被忽略。请各位指点,谢谢。 补充:本问题的解决目的就是想在消息处理函数中释放所传递过去的指针所指向的内存,如果无法保证PostMessage所发送的消息一定被处理,将可能造成内存泄漏。如果各位有解决PostMessage中的指针参数问题的经验,也请不吝赐教,谢谢。
解决方案 »
- VC获取网页源码一段代码,编译没有错,执行错了
- ShockWave Flash Object控件支不支持FLV文件的播放?
- 结构变量的赋值,在线等,回贴散分
- 请问在哪里可以下载VC的帮助文档?
- 如何用VC实现word中的标注功能并能在打印中显示标注,谢谢!
- 读刻录机中图片文件到我的listctrl,无法显示系统文件图标
- Visual C++网络高级编程的源程序,麻烦给我发一份 。
- 如何让对话框程序启动时,不最小化显示?
- 如何在MFC的程序中显示word/ppt格式的文本
- 我已经打开BMP图像,但是我想缩放图像并且要坐标转换,哪位大侠肯指点?
- 关于目录比较问题
- 谁有inside ole2 中文版 这本书?
响应函数为LRESULT CSuperviseDlg::OnInsertChannel(WPARAM uID,LPARAM lEvent)。另外,上面的问题中,PostMessage和处理该消息的函数是不在同一线程的。曾考虑过使用PostThreadMessage,但目前觉得并不合适。
1.你的信息循环有否对应的case
2.你post出去的信息是否真的进入了信息队列对于考虑1,你可以检查你的信息循环代码代码
对于考虑2,你可以检查postmessage的返回值,它表明信息是否被扔进信息队列3.这是一个很重要的一点,信息循环一定要用postquitmessage退出
if(!PostMessage(m_hSuperviseWnd,WM_INSERT_CHANNEL,(WPARAM)pDisplayInfo,0))
{
delete pDisplayInfo;
}
这是不是意味着,如果发送消息不成功,由本身所在的函数释放内存;如果发送消息成功,则由处理该消息的函数释放内存?
也就是说,采用这种方式,不论如何,(在仅将消息发给某一指定窗口时)都能保证指针所指的内存可以被释放,不致于造成内存泄漏--而不会出现以下现象:消息被成功发送出去,但却没有被响应和处理?
不如Post失败时,继续Post时,可能局部变量会被释放掉的。搞一定的。SendMessage
int nRes = 0 ;nRes = SendMessage(.....)nRes 为对方响应函数处理完成后返回代码从该代码,可分析对方执行的情况
问题举例如下:
假如PostMessage发送是成功的,但却没有被所指定的窗口响应和处理,也就是被指定的窗口并不知有这样的消息发过来。这样的话,虽然我使用了
if(!PostMessage(m_hSuperviseWnd,WM_INSERT_CHANNEL,(WPARAM)pDisplayInfo,0))
{
delete pDisplayInfo;
},由于发送成功,所以并不会在以上代码中释放内存。又由于被指定的窗口并不知有这样的消息发过来,所以也不会在其响应函数LRESULT CSuperviseDlg::OnInsertChannel(WPARAM uID,LPARAM lEvent)中释放内存(代码中,我已经在该函数作了释放内存的处理),从而造成内存泄漏。
有什么办法避免以上造成的内存泄漏?或者还是以上现象在MFC中并不会出现?
楼主既然需要一个同步调用,那还是考虑 SendMessage 吧,至于界面死锁,应该是双方互等消息的原因。有一个方法可以试一下:
用一个自定义消息:WM_SIG_EVENT,
先 SendMessage(m_hSuperviseWnd, WM_SIG_EVENT, 0, 0);
然后在 m_hSuperviseWnd 的 WM_SIG_EVENT 消息处理函数中,再给自己发消息:
SendMessage(m_hWnd, WM_INSERT_CHANNEL,....);
这样就可以避免死锁了,而且整个调用还是同步的。