Qt多线程的几种实现方式
在Qt中经常会遇到耗时操作,需要并发执行,这个时候就要用到多线程。Qt的多线程有多种实现形式,这里介绍3种方式。
- 类实现形式
用类实现多线程是最传统的实现形式,思想是写一个继承QThread的类,然后通过run()来开启线程。
代码示例:
.h文件
#include <QThread>
class xthread : public QThread
{
Q_OBJECT
public:
explicit xthread(QObject *parent = nullptr);
void run(); //任务处理线程
~xthread(){
}
};
.cpp文件
xthread::xthread(QObject *parent)
{
}
void xthread::run()
{
//待执行程序
}
最后在你需要调用线程的地方用start()开启即可。
main.cpp
#include <Xthread.h>
xthread *ht = nullptr;
xt = new xthread;
xt -> start();
// 线程销毁,释放内存
delete xt;
xt = nullptr;
- movetothread
movetothread是Qt5的新特性,也是官方推荐的方法。下面推荐一种和计时器结合的实现方法,写法非常简洁高效。
.cpp文件
x_thread = new QThread;
x_timer = new QTimer;
// 在func()中实现函数主体
connect(x_timer,SIGNAL(timeout()),this,SLOT(func()),Qt::DirectConnection);
// 计时器的自动销毁,不需要再手动delete,但需要stop!
connect(x_thread, SIGNAL(finished()), x_timer, SLOT(deleteLater()));
x_timer->start(500);
x_timer->moveToThread(x_thread);
x_thread->start();
.h文件
#include <QTimer>
#include <QThread>
QTimer *x_timer = nullptr;
QThread *x_thread = nullptr;
~destructor(){
if (x_thread) {
x_thread->quit();
x_thread->wait();
delete x_thread;
x_thread = nullptr;
}
}
- 使用QtConcurrent
QtConcurrent严格来说应该算异步操作而不是多线程,但其实它也是调用了线程池,实现与多线程非常相似,它的实现代码非常简单。
#include <QtConcurrent/QtConcurrent>
QtConcurrent::run([=]()
{
func(); // 耗时操作直接写在这里
});
异步的详细说明在我前面的博客中,这里贴个连接,不赘述:
Qt简单的异步操作实现方法