本帖最后由 sha_jinhao 于 2013-04-27 11:15:34 编辑

解决方案 »

  1.   

    想“听”是不可能的,CSDN还不支持语音上传。就看看吧
      

  2.   

    1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。
    2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。
    你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。
    另外消息队列是系统帮你维护的。SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。
    PostMessage邮寄消息到消息队列,不等待。
    两者都是借助于user32模块
      

  3.   


    看了N遍还云里雾里的人怎么能是老师, 我是一极品菜鸟
      希望能有一针见血的回复, 比如:谈一下为什么消息队列要依赖一个窗口, 新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
      

  4.   

    stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率
    为什么消息队列要依赖一个窗口
    消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
    当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空
      

  5.   

    STL博大精深,我算的比较多的,各种容器用过一大半,但是要说其中的算法,诸如红黑树之类的,具体的还是要看   侯杰大师的 《STL源码剖析》SendMessage为什么能做到阻塞,主要是PeekMessage消息队列,把消息提前处理了。
    而PostMessage只是进了队列。
      

  6.   


    明白了, 消息队列是系统维护的, 线程可以有消息队列但是不能根据窗口句柄发消息给它
    有窗口句柄的类可以通过消息映射宏ON_MESSAGE来添加消息映射,线程处理消息通过ON_THREAD_MESSAGE添加映射且必须继承CWinThread,通过PostThreadMessage发消息
    PostThreadMessage通过线程id发消息, PostMessage通过窗口句柄发消息。
    我理解得对吗?
      

  7.   

    stl用的比较多的还是vector,find,sort,其他的不会用。有点就是,可以让我少写很多代码。
    CWinThread是MFC封装的线程类,要搞清楚,它包含了UI线程和工作者线程,UI类是封装了消息循环的,所以每个MFC程序必须有一个CWinThread类继承下来,也就是app类,也就是主类了。工作者线程不封装消息循环,是用于辅助用的线程,所以你问的消息队列是否有一个线程在维护它,现在应该明白了吧
    sendmessage因为它是将消息直接放到winproc回调中进行处理,按照函数调用规则,肯定会等消息处理函数返回之后,SendMessage才返回。而PostMessage却没有发送消息,PostMessage是将消息放入消息队列中,然后立刻返回,至于消息何时被处理,PostMessage完全不知道,此时只有消息循环知道被PostMessage的消息何时被处理了。
      

  8.   

    线程可以有消息队列但是不能根据窗口句柄发消息给它
    ------------
    这个不太准确,比如postmessage把消息发送到线程的消息队列,然后通过getmeesage/peekmessage从消息队列里取出消息,再派送到具体的窗口去处理。PostThreadMessage也是把消息发送到线程的消息队列,getmessage/peekmessage后线程函数自己处理了,没有派送到具体的窗口去,因为没窗口。
    sendmessage发送消息就不会进消息队列了,直接发送到目的窗口
      

  9.   

    你可以看STL分析,STL的电子书很多的!!
    这些都是看你是否处理数据信息。。