1. 如果一个单文档(SDI)的MFC程序,只有一个主线程,那么这个应用程序有几个消息循环?几个消息队列?
   系统消息队列和用户消息队列各保存什么消息?这些消息队列在什么地方?
2.如果一个多文档(MDI)文档的MFC程序,只有一个主线程,那么这个应用程序有几个消息循环?几个消息队列?
   系统消息队列和用户消息队列各保存什么消息?这些消息队列在什么地方?
3.如果一个单文档(SDI)的MFC程序,除了有一个主线程外,还有两个工作者线程和三个用户界面线程,
  那么这个应用程序有几个消息循环?几个消息队列?系统消息队列和用户消息队列各保存什么消息?这些消息队列在什么地方?
4.是不是每个窗口都有一个消息队列?
5.消息循环,消息队列,线程,窗口之间关系到底是怎么样的呢?非常感谢!!!

解决方案 »

  1.   

    1.一个线程最多一个队列不过可以有多个嵌套的消息循环,消息队列由OS管理
    2,同上
    3
    其实就是当用户调用了设计消息循环的函数时(比如创建窗口,调用GetMessage等)时,系统为线程创建消息队列,由系统管理,属于这个线程的所有界面对象的消息都放在这里,由GetMessage等函数来取得消息,当GetMessage处在一个循环中时就是一个消息循环(就是不断的取消息的意思).
      

  2.   

    a、消息分系统消息、用户消息,但是消息队列没有这种区别
    b、一个线程至多可以拥有一个消息队列,MFC的UI线程在int CWinThread::Run()内会调用::PeekMessage()、BOOL CWinThread::PumpMessage(),而在PumpMessage()里会调用::GetMessage()、::TranslateMessage()、::DispatchMessage(),而这些合起来(包括Run()里的几个循环)就构成了一个完整的消息循环
    c、窗口是属于线程的,同一线程内的窗口共享此线程的消息队列、消息循环
    d、其实一个单文档(SDI)的MFC程序,就有很多的窗口在里面,比如框架、菜单、工具条、状态条等等都是一个窗口
    e、消息队列由OS管理,其实就是一个受保护的数据结构罢了,消息队列如果存满消息(有大小限制),就会丢消息了,只要把程序耗住(可以阻塞、也可耗CPU),并且用一种可验证的方法发消息给它,你就可以见到了
    顺便问一下楼上的兄弟:嵌套的消息循环啥样子的,没碰过,可能是孤陋寡闻了
      

  3.   

    http://dev.csdn.net/develop/article/15/15753.shtm
      

  4.   

    比如普通窗口中弹出的模式对话框就是一个嵌套的消息循环,就是原来的消息循环没用了,消息都被对话框来获取了(通过GetMessage),所以这个时候普通窗口不会处理很多消息(因为它不知道有消息嘛),不过对话框的消息循环会把UI更新的消息发到普通窗口,直到对话框销毁,它的消息循环自然结束了,然后普通窗口的消息循环又能得到所有的消息了
      

  5.   

    哦,原来如此,谢谢weirdy(远古传说)
      

  6.   

    系统消息队列只有一个,放哪我不知道,赫赫
    工作者线程什么都没有,没意义1 一个消息循环 一个消息队列
    2 一个消息循环 一个消息队列
    3 主线程一个消息循环 一个消息队列,三个用户界面线程对应3个消息循环 3个消息队列
    4 不是
    5.每个线程对应一个消息队列,每个消息队列对应一个消息循环(要是不开消息循环就没意义了)
    一个线程可以n个窗口,它们共享一个消息队列 weirdy(远古传说)说的嵌套的消息循环是故意骗你的,即便是模式对话框仍和线程内的其它窗体共享一个消息循环
      

  7.   

    一个线程(worker线程没有),一个消息循环,一个消息队列
      

  8.   

    线程不对应消息队列,一个线程有没有消息队列要看这个线程有没有窗口或者说有没有调用过GDI函数。
    消息队列分系统消息队列和线程消息队列,系统产生的消息都会先进入系统消息队列再由系统分捡送入各相应线程的消息队列。
    消息循环只有一个,但可嵌套。这是由程序从消息队列取出消息-处理-返回-再取出消息这样一个消息循环所决定的。当多个消息循环相嵌套时,只会一层一层的从最里层到最外层返回。这就WINDOWS程序的以消息为基础以事件驱动的模式运作的。你学习一下SDK编程就能很好的理解WIN程序的运作模式。