QThread 的使用方法(转)
来源:互联网 发布:mysql数据库密码查看 编辑:程序博客网 时间:2024/04/28 21:30
原博地址:http://blog.csdn.net/luoluo90428/article/details/6643547
起源
昨天不小心看到Qt开发人员( Bradley T. Hughes)Blog中的一片文章 you are-doing-it-wrong 。 结果看得头昏脑胀:好歹也自学了近1年的Qt,也一直很小心、很认真地阅读Qt和manual和例子等资料,却被突然告知,QThread的正确使用方法是一种自己从没见过,而且Qt manual、example、书籍中都没有提到过的一种方法。到底怎么了...
莫非manual、exmaple以及资料中的介绍都是错的??
认真看看其他的人的评论,总算理清了一点头绪。所有事情源于 QThread 的事件循环!
QThread 的两种使用方法
1. 不使用事件循环。这是官方的 Manual 、example 以及相关书籍中都介绍的一种的方法。
a. 子类化 QThread
b. 重载 run 函数,run函数内有一个 while 或 for 的死循环
c. 设置一个标记为来控制死循环的退出。
2. 使用事件循环。(博客 you are-doing-it-wrong 批驳的就是这种情况下的 一种用法。)
a. 子类化 QThread,
b. 重载 run 使其调用 QThread::exec()
c. 并为该类定义信号和槽,这样一来,由于槽函数并不会在新开的 thread 运行,很多人为了解决这个问题在构造函数中调用 moveToThread(this);
Bradley T. Hughes 给出说明是: QThread 应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码。需要运行的代码应该放到一个QObject的子类中,然后将该子类的对象moveToThread到新线程中。
而争论和不解正是这样的一条语句造成的。
另外:
在Qt4.3(包括)之前,run 是虚函数,必须子类化QThread来实现run函数。
而从Qt4.4开始,qthreads-no-longer-abstract ,run 默认调用 QThread::exec() 。这样一来不需要子类化 QThread 了,只需要子类化一个 QObject 就够了,这正是被 Bradley T. Hughes推荐的方法。
终于看懂了,但
不管怎么说,都应该是 QThread 当初的设计导致的这种问题,而所有文档和例子中都没有提到该如何使用Qthread 进一步加剧了对QThread的这种误用。
相关链接:
http://labs.qt.nokia.com/blogs/2010/06/17/youre-doing-it-wrong/
http://labs.qt.nokia.com/blogs/2006/12/04/threading-without-the-headache/
http://labs.qt.nokia.com/blogs/2007/07/05/qthreads-no-longer-abstract/
http://gitorious.org/qthreadhowto/qthreadhowto/trees/master
http://blog.exys.org/entries/2010/QThread_affinity.html
http://thesmithfam.org/blog/2010/02/07/talking-to-qt-threads/
- QThread 的使用方法(转)
- QThread 的使用方法(zz)
- QThread 的使用方法
- QThread 的使用方法
- QThread 的使用方法
- QThread的正确使用方法
- QThread的使用方法
- QThread 的使用方法
- QThread 的使用方法
- QThread的正确使用方法
- QThread 的使用方法
- QThread 的使用方法 注意事项
- 纠正你的QThread 的使用方法
- QThread使用方法总结
- QThread 正确使用方法
- 如何正确的使用QThread?(QThread入门)
- QThread 正确使用方法 - tangaowen的专栏 - 博客频道 - CSDN.NET
- qt线程 qthread(转)
- iOS相机字体英文转中文,相机全屏
- 请求重定向(四种方法)
- 【酸甜苦辣】记迭代一的酸甜苦辣(妍喆篇)
- js中运算符的优先级
- lnmp一键安装+wordpress
- QThread 的使用方法(转)
- SpringMVC系列(四)注解方式上传文件
- .net基础扫盲-对象初始化器
- 解决Ubuntu9.10下txt文档中中文文本乱码问题
- 第十四周总结
- C#学习之基础
- 如何获取内核指定线程的调用栈
- 大小写不一致,导致Spring注入失败问题说明
- 学习方法