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
提交一個函子或一個執行緒安全的方法來線上程池中執行。