【讨论帖】问两个问题

时间:2022-08-27 20:09:02
1、STL用的最多的就是容器了,但是对于算法用得比较少, 我想听一下大家使用stl算法的经验(算法的功能,使用场景,优点缺点)

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


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

回答任意一个问题均可

16 个解决方案

#1


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

#2


怎么看此贴的作者是老师出身。
不妨你先把自己看了N遍的东西总结出来让大家“听听”。
想要取之,必先予之啊

#3


在你总结的基础上,大家在“一阵见血”,否则怕惹老师不开心啊

#4


1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。
2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。
你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。
另外消息队列是系统帮你维护的。

SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。
PostMessage邮寄消息到消息队列,不等待。
两者都是借助于user32模块

#5


引用 3 楼 happyparrot 的回复:
在你总结的基础上,大家在“一阵见血”,否则怕惹老师不开心啊


我只是一个屌丝娃,说得有理皆有分

#6


引用 2 楼 happyparrot 的回复:
怎么看此贴的作者是老师出身。
不妨你先把自己看了N遍的东西总结出来让大家“听听”。
想要取之,必先予之啊


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


#7


引用 4 楼 VisualEleven 的回复:
1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。
2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。
你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。
另外消息队列是系统帮你维护的。

SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。
PostMessage邮寄消息到消息队列,不等待。
两者都是借助于user32模块
说的不错 【讨论帖】问两个问题

#8


stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率
为什么消息队列要依赖一个窗口
消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口

新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空

#9


STL博大精深,我算的比较多的,各种容器用过一大半,但是要说其中的算法,诸如红黑树之类的,具体的还是要看   侯杰大师的 《STL源码剖析》

SendMessage为什么能做到阻塞,主要是PeekMessage消息队列,把消息提前处理了。
而PostMessage只是进了队列。

#10


引用 8 楼 dahaiI0 的回复:
stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率
为什么消息队列要依赖一个窗口
消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口

新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空


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

#11


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

#12


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

#13


【讨论帖】问两个问题
欢迎大家踊跃回复, 6点下边的时候结贴

#14


引用 13 楼 wumn29 的回复:
【讨论帖】问两个问题
欢迎大家踊跃回复, 6点下边的时候结贴

6点下班的时候

#15


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

#16


看回复的,已复制

#1


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

#2


怎么看此贴的作者是老师出身。
不妨你先把自己看了N遍的东西总结出来让大家“听听”。
想要取之,必先予之啊

#3


在你总结的基础上,大家在“一阵见血”,否则怕惹老师不开心啊

#4


1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。
2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。
你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。
另外消息队列是系统帮你维护的。

SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。
PostMessage邮寄消息到消息队列,不等待。
两者都是借助于user32模块

#5


引用 3 楼 happyparrot 的回复:
在你总结的基础上,大家在“一阵见血”,否则怕惹老师不开心啊


我只是一个屌丝娃,说得有理皆有分

#6


引用 2 楼 happyparrot 的回复:
怎么看此贴的作者是老师出身。
不妨你先把自己看了N遍的东西总结出来让大家“听听”。
想要取之,必先予之啊


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


#7


引用 4 楼 VisualEleven 的回复:
1. STL中的东西至少我用的不多,但是STL很强大的,很多容器类很好用,算法使用也很简单。
2. AfxbeginThread是MFC类中全局函数,即可以创建工作线程,也可以创建UI线程,工作线程线程和UI线程的区别不是很明显,工作线程中自己加入消息循环处理也和UI线程很类似了。工作线程默认是没有消息队列的。
你用AfxBeginThread创建的不是主线程了,主线程只有一个,主线程是系统启动进程时候为你创建的。主线程如果是正常退出的话,所有其它子线程也就被终止了,这样进程就结束了。
另外消息队列是系统帮你维护的。

SendMessage直接发送消息到窗口过程,不过消息队列,等待处理函数完成以后返回。
PostMessage邮寄消息到消息队列,不等待。
两者都是借助于user32模块
说的不错 【讨论帖】问两个问题

#8


stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率
为什么消息队列要依赖一个窗口
消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口

新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空

#9


STL博大精深,我算的比较多的,各种容器用过一大半,但是要说其中的算法,诸如红黑树之类的,具体的还是要看   侯杰大师的 《STL源码剖析》

SendMessage为什么能做到阻塞,主要是PeekMessage消息队列,把消息提前处理了。
而PostMessage只是进了队列。

#10


引用 8 楼 dahaiI0 的回复:
stl的算法我用的也不是很多,比较常用的像sort,find,for_each等,优点嘛,稳定强大高效率
为什么消息队列要依赖一个窗口
消息队列没有依赖窗口,一个线程可以有消息队列而没有窗口

新建一个MFC类,必须让Create创建一个窗口才能向它发消息?
当然要create才能发消息,create是创建一个窗口,类对象跟窗口仅有的关系是类对象有个成员变量m_hWnd,保存了与之attach的窗口句柄,不创建窗口句柄就为空


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

#11


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

#12


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

#13


【讨论帖】问两个问题
欢迎大家踊跃回复, 6点下边的时候结贴

#14


引用 13 楼 wumn29 的回复:
【讨论帖】问两个问题
欢迎大家踊跃回复, 6点下边的时候结贴

6点下班的时候

#15


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

#16


看回复的,已复制