项目遇到的问题, 解决了但是时间紧张的原因 , 没有仔细考虑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 为什么就能得到影响??? 此时也没有进行消息循环。 

解决方案 »

  1.   

    窗口注册的时候,就指定了窗口处理函数MainWindowProc,这个函数是由os调用,任何发送给这个窗口的消息,os都会捕获,并交由MainWindowProc处理,和有没有消息循环没有关系。
    消息循环的作用是让程序在消息中等待,如果没有消息循环程序就直接退出了。
      

  2.   

    谢谢您得回答, 本来如果按原理来说是这样。
    但是在 workerThread 中给主窗口线程发送的消息确实是得不到处理(在对应消息的 case 下设置断点不能被触发, 如果在 workerThread 换成用 SendMessage 发送就会因消息得不到处理而进入阻塞状态). 
    您上面所说的不能解析这种情况.
    难道和发送消息操作所在的线程有关?
    我再试试!! 
      

  3.   

    个人的理解,PostMessage是将消息放到队列中,而SendMessage则是将消息处理函数当作一个子程序来调用,写SendMessage(hWnd,...);就象直接写WndProc(hWnd,...);直接调用,所以不需要管消息循环.而DispatchMessage则是将消息队列和消息函数联系在了一起,使用相应处理函数去处理消息。
    换言之,PostMessage需要DisPatchMessage才能奏效,而SendMessage则不需要。
      

  4.   

    1.消息队列.每个线程都有自己的消息队列,注意是线程不是窗口.
    2.Post和Send机制不一样.Post只负责把消息放到队列中,然后就立即返回.Send会等待处理完成再返回.但同样需要消息循环.
    3.对应的caase下断点不能被触发.....如果另一个消息在处理中.后来的消息只能等待前一个消息处理完成.和Send被阻塞的道理一样.
    最后,你的代码不完整.很难说是哪里出了问题:
    1.同步对象什么时候创建的???
    2.窗口什么时候创建的???
    3.线程什么时候创建的???
    4.do something 里面会持续多久??还是根本就是一个不会返回的执行体????
      

  5.   

    疑惑: 
     winmain 中在消息派遣进行之前 发送的消息 WM_MAINXXX 为什么就能得到影响??? 此时也没有进行消息循环。
    -------------------------------------------------------------------------------------------
    当线程调用SendMessage给本线程拥有的窗体发送消息的时候
    也就是说调用SendMessage的线程负责执行指定窗体的处理函数
    这样就会直接调用窗体处理函数(在注册窗口类时指定的)还有就是工作线程里发送的消息,我觉的如果PostMessage时g_hMainWnd所对应的窗体已正确创建的话,这个消息应该是可以被响应的
      

  6.   

    谢谢大家的回复, starwing83  说的有点道理。我考虑了这个过程, 可以解释这种情况。
    比较简单的问题,只是为了深入的了解 windows 消息循环机制 ,向大家学到了不少的知识, 谢谢了。