拜读了网上一些与PostMessage相关的文章,我了解到当广播消息到多个窗口时,有可能一些窗口会简单地忽略该消息。但假如我向某一指定窗口(比如PostMessage(m_hSuperviseWnd,WM_INSERT_CHANNEL,(WPARAM)pDisplayInfo,0);其中m_hSuperviseWnd是窗口句柄,WM_INSERT_CHANNEL是自定义的消息,pDisplayInfo是所要传递的指针参数)发送消息时,不知是不是也有可能被忽略。请各位指点,谢谢。    补充:本问题的解决目的就是想在消息处理函数中释放所传递过去的指针所指向的内存,如果无法保证PostMessage所发送的消息一定被处理,将可能造成内存泄漏。如果各位有解决PostMessage中的指针参数问题的经验,也请不吝赐教,谢谢。

解决方案 »

  1.   

    是有响应函数的,比如声明了ON_REGISTERED_MESSAGE(WM_INSERT_CHANNEL,OnInsertChannel),
    响应函数为LRESULT CSuperviseDlg::OnInsertChannel(WPARAM uID,LPARAM lEvent)。另外,上面的问题中,PostMessage和处理该消息的函数是不在同一线程的。曾考虑过使用PostThreadMessage,但目前觉得并不合适。
      

  2.   

    有几个需要考虑的:
    1.你的信息循环有否对应的case
    2.你post出去的信息是否真的进入了信息队列对于考虑1,你可以检查你的信息循环代码代码
    对于考虑2,你可以检查postmessage的返回值,它表明信息是否被扔进信息队列3.这是一个很重要的一点,信息循环一定要用postquitmessage退出
      

  3.   

    那假如我使用
    if(!PostMessage(m_hSuperviseWnd,WM_INSERT_CHANNEL,(WPARAM)pDisplayInfo,0))
    {
        delete pDisplayInfo;
    }
    这是不是意味着,如果发送消息不成功,由本身所在的函数释放内存;如果发送消息成功,则由处理该消息的函数释放内存?
        也就是说,采用这种方式,不论如何,(在仅将消息发给某一指定窗口时)都能保证指针所指的内存可以被释放,不致于造成内存泄漏--而不会出现以下现象:消息被成功发送出去,但却没有被响应和处理?
      

  4.   

    PostMessage时,一般用成员变量或全局变量,我一般这样搞的。
    不如Post失败时,继续Post时,可能局部变量会被释放掉的。搞一定的。SendMessage
      

  5.   

    用 sendMessage 吧
    int nRes = 0 ;nRes = SendMessage(.....)nRes 为对方响应函数处理完成后返回代码从该代码,可分析对方执行的情况
      

  6.   

    SendMessage,鄙人也曾经试过,不过效果并不理想(会导致程序像死了一样)。
      

  7.   

    那就从另一个程序再 POST 一个执行完成的消息回来
      

  8.   

    如果可以使用PostMessage一个执行完成的消息回来的话,那在发送返回消息的地方(函数)释放指针所指定的内存就可以了,而且也就可以不用PostMessage一个消息回来。    问题的重点在于,一个被认为发送成功的消息,在指定的窗口中会不会一定会接收到的?(“会接收到”我的意思是程序会调用相应的响应函数,如果“不会被接收到”,那就不会调用相应的响应函数,这样就连要一个返回消息恐怕也是不可能的)
        问题举例如下:
        假如PostMessage发送是成功的,但却没有被所指定的窗口响应和处理,也就是被指定的窗口并不知有这样的消息发过来。这样的话,虽然我使用了
        if(!PostMessage(m_hSuperviseWnd,WM_INSERT_CHANNEL,(WPARAM)pDisplayInfo,0))
        {
            delete pDisplayInfo;
        },由于发送成功,所以并不会在以上代码中释放内存。又由于被指定的窗口并不知有这样的消息发过来,所以也不会在其响应函数LRESULT CSuperviseDlg::OnInsertChannel(WPARAM uID,LPARAM lEvent)中释放内存(代码中,我已经在该函数作了释放内存的处理),从而造成内存泄漏。
        有什么办法避免以上造成的内存泄漏?或者还是以上现象在MFC中并不会出现?
      

  9.   

    PostMessage 的返回值是说是否成功的把消息 post 出去,但并不等待这个消息被处理。
    楼主既然需要一个同步调用,那还是考虑 SendMessage 吧,至于界面死锁,应该是双方互等消息的原因。有一个方法可以试一下:
    用一个自定义消息:WM_SIG_EVENT,
    先 SendMessage(m_hSuperviseWnd, WM_SIG_EVENT, 0, 0);
    然后在 m_hSuperviseWnd 的 WM_SIG_EVENT 消息处理函数中,再给自己发消息:
    SendMessage(m_hWnd, WM_INSERT_CHANNEL,....);
    这样就可以避免死锁了,而且整个调用还是同步的。