请问高手什么时候该用PostMessage,什么时候该用SendMessage。还有在什么情况下需要用::PostMessage,什么时候需要用::SendMessage?
希望能特别针对多线程的程序进行一下举例说明。不甚感激。

解决方案 »

  1.   

    在多线程里用PostMessage比较好,区别MSDN上已经说的很清楚了
      

  2.   

    SendMessage函数用于向窗口发送消息。与PostMessage不同,SendMessage函数是一个同步函数。直到接收窗口的窗口过程对消息进行处理后,函数才返回。        当需要某个窗口过程立即执行一项任务时,通常发送一条消息。SendMessage函数将消息直接发送给接收窗口的窗口过程。SendMessage函数等到窗口过程完成消息处理后才返回消息结果。父窗口和子窗口常以互相发送消息的方式进行通信。例如:一个以编辑控件为子窗口的父窗口,可以通过向子窗口发送消息来设置控件的文本。控件也可以向父窗口发送消息,以通知父窗口用户对文本的改变。        如果接收线程与发送线程相同,则SendMessage函数就直接调用窗口过程,如果接收线程与发送线程不同,则两个消息队列就对消息传递进行同步。发送线程一直等到接收线程对消息处理后才能继续执行。如果接收线程不在执行消息循环,则它就不会对消息进行处理。因而,如果向不在执行消息循环的线程发送了一条消息,则发送线程将停止响应。 
      

  3.   

    PostMessage发送消息,不等消息处理完成立刻返回
    SendMessage发送消息,等消息完成才返回如:
    work_thread 中
    {
    ...
    char buf[MAX_PATH];
    ...
    SendMessage(m_MainWnd, WM_MYMSG, (DWORD)buf, 0);
    ...
    }主程序中
    CMainFrame::OnMyMsg(WPARAM wParam, LPARAM lParam)
    {
       char *p = (char *)wParam;
       AfxMessageBox(p);
    }以上例子中就只能用SendMessage,如果用PostMessage,由于PostMessage立刻返回, buf不再有效,等主程序处理消息的时候再访问buf就会出错,但如果将buf定义为全局变量,用PostMessage 就是可以的。
      

  4.   

    区别:
    postMessage发出消息后,向消息放到消息队列中,该函数结束.
    SendMessage发出消息后,一直等到该消息执行完毕,才返回。
      

  5.   

    PostMessage进消息队列
    SendMessage不进消息队列
    如果用SendMessage发送消息不能用窗口类的PreTranslateMessage()截获该消息
      

  6.   

    如果消息参数里面有局部指针,非要用SendMessage。如果只包含数值而且对返回的值不感兴趣,可以用PostMessage。SendMessage为同步函数,只能用于本县城,而PostMessage比较复杂,它实际上调用PostThreadMessage。还涉及进程通讯的问题。
      

  7.   

    SendMessage为同步函数,只能用于本县城>>不同意,我现在的多线程程序里。
    使用SendMessage()效果好。因为使用PostMessage()的话,主线程(接受消息的线程)的消息队列接受了
    太多的消息,来不及处理。
    阻塞掉了
      

  8.   

    PostMessage()是向消息队列中发送一个消息
    SendMessage()是发送并且处理一个消息
      

  9.   

    sendmessage()发的消息,程序必须马上处理,不用排队啊。
    而postmessage()发的消息则要在消息队列中排队,等候处理。
      

  10.   

    Sendmessage可以看成是直接调用窗口程序
      

  11.   

    SendMessage是插队,PostMessage是排队
      

  12.   

    SendMessage是要等待消息执行完的返回,而PostMessage是则把消息扔进队列后直接返回。
      

  13.   

    PostMessage是所谓的异步函数;它负责将相应的消息放入目标线程的注册消息队列中。只用当目标线程处于闲置时才会依次处理改消息队列;
    而SendMessage使用的是同步机制;它相当于直接调用了目标线程所建立窗口的窗口函数;
    详情请参加《Windows核心编程》“窗口”一章