【讨论帖】问两个问题

wumn29 2013-04-27 10:23:59
1、STL用的最多的就是容器了,但是对于算法用得比较少, 我想听一下大家使用stl算法的经验(算法的功能,使用场景,优点缺点)

2、CWinThread到底干了神马, 如果它创建了UI线程,那么工作线程在哪?是主线程吗?消息队列是不是有一个线程在维护它? SendMessage和PostMessage是怎么实现的,为什么SendMessage能够阻塞?


问题1可以自由发挥
问题2要一针见血

回答任意一个问题均可
...全文
132 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumn29 2013-04-27
  • 打赏
  • 举报
回复
引用 13 楼 wumn29 的回复:
欢迎大家踊跃回复, 6点下边的时候结贴
6点下班的时候
wumn29 2013-04-27
  • 打赏
  • 举报
回复
欢迎大家踊跃回复, 6点下边的时候结贴
dahaiI0 2013-04-27
  • 打赏
  • 举报
回复
线程可以有消息队列但是不能根据窗口句柄发消息给它 ------------ 这个不太准确,比如postmessage把消息发送到线程的消息队列,然后通过getmeesage/peekmessage从消息队列里取出消息,再派送到具体的窗口去处理。PostThreadMessage也是把消息发送到线程的消息队列,getmessage/peekmessage后线程函数自己处理了,没有派送到具体的窗口去,因为没窗口。 sendmessage发送消息就不会进消息队列了,直接发送到目的窗口
Ginie 2013-04-27
  • 打赏
  • 举报
回复
stl用的比较多的还是vector,find,sort,其他的不会用。有点就是,可以让我少写很多代码。 CWinThread是MFC封装的线程类,要搞清楚,它包含了UI线程和工作者线程,UI类是封装了消息循环的,所以每个MFC程序必须有一个CWinThread类继承下来,也就是app类,也就是主类了。工作者线程不封装消息循环,是用于辅助用的线程,所以你问的消息队列是否有一个线程在维护它,现在应该明白了吧 sendmessage因为它是将消息直接放到winproc回调中进行处理,按照函数调用规则,肯定会等消息处理函数返回之后,SendMessage才返回。而PostMessage却没有发送消息,PostMessage是将消息放入消息队列中,然后立刻返回,至于消息何时被处理,PostMessage完全不知道,此时只有消息循环知道被PostMessage的消息何时被处理了。
wumn29 2013-04-27
  • 打赏
  • 举报
回复
引用 8 楼 dahaiI0 的回复:
stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率 为什么消息队列要依赖一个窗口 消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口 新建一个MFC类,必须让Create创建一个窗口才能向它发消息? 当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空
明白了, 消息队列是系统维护的, 线程可以有消息队列但是不能根据窗口句柄发消息给它 有窗口句柄的类可以通过消息映射宏ON_MESSAGE来添加消息映射,线程处理消息通过ON_THREAD_MESSAGE添加映射且必须继承CWinThread,通过PostThreadMessage发消息 PostThreadMessage通过线程id发消息, PostMessage通过窗口句柄发消息。 我理解得对吗?
傻X 2013-04-27
  • 打赏
  • 举报
回复
STL博大精深,我算的比较多的,各种容器用过一大半,但是要说其中的算法,诸如红黑树之类的,具体的还是要看 侯杰大师的 《STL源码剖析》 SendMessage为什么能做到阻塞,主要是PeekMessage消息队列,把消息提前处理了。 而PostMessage只是进了队列。
dahaiI0 2013-04-27
  • 打赏
  • 举报
回复
stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率 为什么消息队列要依赖一个窗口 消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口 新建一个MFC类,必须让Create创建一个窗口才能向它发消息? 当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空
wumn29 2013-04-27
  • 打赏
  • 举报
回复
引用 4 楼 VisualEleven 的回复:
1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。 2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。 你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。 另外消息队列是系统帮你维护的。 SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。 PostMessage邮寄消息到消息队列,不等待。 两者都是借助于user32模块
说的不错
wumn29 2013-04-27
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
怎么看此贴的作者是老师出身。 不妨你先把自己看了N遍的东西总结出来让大家“听听”。 想要取之,必先予之啊
看了N遍还云里雾里的人怎么能是老师, 我是一极品菜鸟 希望能有一针见血的回复, 比如:谈一下为什么消息队列要依赖一个窗口, 新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
wumn29 2013-04-27
  • 打赏
  • 举报
回复
引用 3 楼 happyparrot 的回复:
在你总结的基础上,大家在“一阵见血”,否则怕惹老师不开心啊
我只是一个屌丝娃,说得有理皆有分
Eleven 2013-04-27
  • 打赏
  • 举报
回复
1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。 2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。 你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。 另外消息队列是系统帮你维护的。 SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。 PostMessage邮寄消息到消息队列,不等待。 两者都是借助于user32模块
快乐鹦鹉 2013-04-27
  • 打赏
  • 举报
回复
在你总结的基础上,大家在“一阵见血”,否则怕惹老师不开心啊
快乐鹦鹉 2013-04-27
  • 打赏
  • 举报
回复
怎么看此贴的作者是老师出身。 不妨你先把自己看了N遍的东西总结出来让大家“听听”。 想要取之,必先予之啊
快乐鹦鹉 2013-04-27
  • 打赏
  • 举报
回复
想“听”是不可能的,CSDN还不支持语音上传。就看看吧
杀意已决 2013-04-27
  • 打赏
  • 举报
回复
看回复的,已复制
shen_wei 2013-04-27
  • 打赏
  • 举报
回复
你可以看STL分析,STL的电子书很多的!! 这些都是看你是否处理数据信息。。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧