QThread

QThread是Qt实现线程支持的一个低级别的类,QThread对象代表了一个线程。我们通过继承QThread类来实现代码在线程中执行。

class Thread : public QThread { 
protected:
void run() 
{
    /* your thread implementation goes here */
}
};

开启新线程并执行:

Thread *t = new Thread; t->start(); // start(), not run()!

start后将开启一个新线程,新线程调用run()方法,如果不重写,默认的run()实现调用QThread::exec()

QRunnable与QThreadPool

QRunnable是一个轻量的抽象类,用于开启一个在另一个线程执行的任务,通常该任务有“run and forget”的特点。使用方法:

class Task : public QRunnable {
public:
void run() {
/* your runnable implementation goes here */
}
}

要使用QRunnable对象,我们需要QThreadPool(一个管理线程池的类)。通过QThread::start(runnable)将任务放入任务执行队列,如果有线程可用,任务将被取出并运行在该线程中。线程池可在QThreadPool对象内单独管理,同时也有一个全局线程池,通过QThreadPool::globalInstance()获取并管理。
QRunnable不是QObject的子类,没有其他内置的方法能传递执行结果和其他信息,我们需要自己实现传递结果或其他信息的方法,如手写一个互斥锁保护的队列,以保存运行结果。

QtConcurrent

高级别的API,建立在QThreadPool之上,对处理常见的并行计算模式很有用:map,reduce,filter。提供了方便的run()方法在线程中执行指定函数。QtConcurrent的所有方法返回一个QFuture对象,可以在稍后获取其计算状态(进度)。 QFutureWatcher可以使用来监控QFuture进度,并通过信号槽机制与其交互。

对比

Qt-线程相关的几个类的介绍与使用_子类

参考:

  1. https://wiki.qt.io/Threads_Events_QObjects#QThread