QThread使用整理3-使用方法

来源:互联网 发布:网络参与赌博如何量刑 编辑:程序博客网 时间:2024/05/20 08:25

所有事情源于 QThread的事件循环!

 

 

QThread的两种使用方法

 

 

1. 不使用事件循环。这是官方的 Manualexample以及相关书籍中都介绍的一种的方法。

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的这种误用。

原创粉丝点击