QThread 的基本用法
QThread
是平台线程的句柄。它允许你通过监视线程的生命周期来管理线程,并请求它完成其工作。
在大多数情况下,不建议继承该类。默认的 run
方法启动一个事件循环,可以将事件分派给生活在类中的对象。通过将 QMetaCallEvent
分派给目标对象来实现跨线程信号槽连接。
QObject
实例可以移动到一个线程,在那里它将处理它的事件,例如定时器事件或槽/方法调用。
要在线程上工作,首先要创建自己的工人类,该工作类派生自 QObject
。然后将其移动到线程。对象可以自动运行自己的代码,例如使用 QMetaObject::invokeMethod()
。
#include <QObject>
class MyWorker : public QObject
{
Q_OBJECT
public:
Q_SLOT void doWork() {
qDebug() << "doWork()" << QThread::currentThread();
// and do some long operation here
}
MyWorker(QObject * parent = nullptr) : QObject{parent} {}
};
class MyController : public QObject
{
Q_OBJECT
Worker worker;
QThread workerThread;
public:
MyController() {
worker.moveToThread(&workerThread);
// provide meaningful debug output
workerThread.setObjectName("workerThread");
workerThread.start();
// the thread starts the event loop and blocks waiting for events
}
~MyController() {
workerThread.quit();
workerThread.wait();
}
void operate() {
// Qt::QueuedConnection ensures that the slot is invoked in its own thread
QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);
}
};
如果你的工作者应该是短暂的并且只在其工作完成时才存在,那么最好通过 QtConcurrent::run
提交一个函子或一个线程安全的方法来在线程池中执行。