while while(GetMessage(&msg,NULL,0,0)) 这里就是消息循环,CreateWindow 所在函数是阻塞了,但是创建出来的窗口是新的UI线程,它怎么会卡假设呢。如果没有这个消息循环,新创建出来的窗口才不会显示!

解决方案 »

  1.   

    --------------
     那里新的UI线程? 很明显的while循环和 createwindows创建出来的窗体都是在winmain函数里面,同一个线程而已。
      

  2.   

    ----- 知道消息驱动的,关键是 上面那段代码 明显是个死循环。while只要不接受wm_quit 就一直循环,在没有消息的时候getmessage 阻塞。 所以无论怎么看,createwindows 都应该假死的,但是为何没有假死呢?
      

  3.   

    --------------
     那里新的UI线程? 很明显的while循环和 createwindows创建出来的窗体都是在winmain函数里面,同一个线程而已。CreateWindow 里面会创建UI线程,你可以简单的用任务管理器查看,调用 CreateWindow  是否多了一个线程!
      

  4.   

    --------------
     那里新的UI线程? 很明显的while循环和 createwindows创建出来的窗体都是在winmain函数里面,同一个线程而已。CreateWindow 里面会创建UI线程,你可以简单的用任务管理器查看,调用 CreateWindow  是否多了一个线程!----------------------------看了,没看到你说的那种情况如果真是滴,那就更有问题了。getmessage取到的只是本线程的消息,creatwindows另开了一个线程,那岂不是getmessage不能取到他的消息?那个循环就毫无作用了。
      

  5.   

    因为DispatchMessage是让窗口的WindowProc去处理消息的,所以窗体界面没假死,而是能显示出来。
      

  6.   

    --------------
     那里新的UI线程? 很明显的while循环和 createwindows创建出来的窗体都是在winmain函数里面,同一个线程而已。CreateWindow 里面会创建UI线程,你可以简单的用任务管理器查看,调用 CreateWindow  是否多了一个线程!
    没有新的UI线程,只有一个线程。
      

  7.   

    消息循环是一个死循环是真的。你主要的问题是没有弄明白windows处理消息的的过程。
    GetMessage之后,DispatchMessage会将消息传给操作系统,而操作系统会调用窗口过程函数对消息进行处理,当然如果粗一点看,我们也可以理解为DispatchMessage调用窗口处理函数。也就是说,虽然消息循环是个死循环,但是,在循过程中,DispatchMessage会调用窗口处理函数来对窗口进行响应,所以窗口会不假死。你每操作一下界面,就会相应的产生一个消息,而在循环中就会对这个消息调用一次窗口处理函数。这个过程就是上面有人说的,消息驱动。