针对这个话题,我将会为大家提供一个完整的攻略。首先,我们需要明确的是,Qt 中开启线程的方式有多种,每种方式都有其优缺点,下面我将一一进行介绍。
方式一:继承 QThread 类
继承 QThread 类是使用 Qt 开启线程最为常见的方式之一。具体步骤如下:
-
定义一个继承自 QThread 的线程类,并重写其 run() 方法,在 run() 方法内实现我们想要进行的操作。
-
在主线程中实例化该自定义线程对象,并调用其 start() 方法开启线程。
示例一:
class MyThread : public QThread
{
public:
void run() override
{
// 写入自己的耗时逻辑处理代码
}
};
// main()
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyThread thread;
thread.start();
return a.exec();
}
方式二:使用 QThread 对象并将一个 QObject 放在其中
使用 QThread 对象并将一个 QObject 放在其中是另外一种在 Qt 中开启线程的方式,它们之间的关系为:一个 QThread 对象拥有一个 QObject 对象。这种方式需要注意的是,使用 QObject::moveToThread() 方法将想要在线程中执行的对象移至 QThread 中。
示例二:
class Worker : public QObject
{
Q_OBJECT
signals:
void workFinished();
public slots:
void doWork()
{
// 写入自己的耗时逻辑处理代码
emit workFinished();
}
};
// main()
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Worker *worker = new Worker;
QThread *thread = new QThread;
worker->moveToThread(thread);
QObject::connect(thread, &QThread::started, worker, &Worker::doWork);
QObject::connect(worker, &Worker::workFinished, thread, &QThread::quit);
QObject::connect(worker, &Worker::workFinished, worker, &Worker::deleteLater);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();
return a.exec();
}
方式三:使用 QtConcurrent::run() 方法
QtConcurrent 命名空间提供了一种快速开启一个线程的方法。使用 QtConcurrent::run() 方法,可以在线程中执行一个函数,并在执行完毕后返回函数的返回值。使用该方式时,注意函数的所有的参数都必须是可以被拷贝的。
示例三:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
auto future = QtConcurrent::run([](){
// 写入自己的耗时逻辑处理代码
return 0;
});
qDebug() << future.result();
return a.exec();
}
以上就是 Qt 中开启线程的三种方式,希望这份攻略能够对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Qt 中开启线程的多种方式小结 - Python技术站