Qt并不是一定要用来做界面开发,其实Qt内部的很多非界面模块也十分优秀,本文紧接着Qt系列的上一篇文章,继续介绍如何使用QObject做基类来开发模块。本文以QThread为例介绍Qt多线程技术的基本知识。
多线程(QThread)
多线程技术是当今编程一个重要领域,C++的很多扩展包都能很好的实现对多线程技术进行开发。Qt框架之中也有一些多线程的模块包,其中最重要的就是QThread类。
基于QThread实现多线程编程主要有两种手段:
- 将以QObject或者QObject继承类为基类开发的用户类实例并移动到一个线程对象之中去执行。QThread帮助给出的例子如下:
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
- 以QThread为基类开发一个可以定义用户方法的新的线程类,需要将线程执行的方法封装到run()函数中。Qthread帮助给出的例子如下:
class WorkerThread : public