Qt中实现多线程的方式。1、利用继承QThread类,重写run函数实习。2、将对象使用moveToThread方法,利用信号槽实现。3、利用QtConcurrent相关QFuture实现。
以前一直用继承QThread,实现它的run()函数的方式实现。这种方式简单粗暴易于实现。后来发现有人用moveToThread这个方式去实现,官方推荐这种方式。
情况1、只是需要执行一次,建议使用moveToThread和QtConcurrent,方便简洁。
情况2、需要不停地执行,继承QThread更好点,这样就run函数实现功能即可。当然也可以用moveToThread的方式,不过就是要自己在写定时器去出发。
情况3、好多任务需要采用多线程,建议采用moveToThread的方式,把所有任务放到一个类,然后根据情况再触发执行。
以上只是个人经验不一定适用所有。
一个简易的例子
按钮点击的时候调用
#include "doworker.h"
#include <QDebug>
doWorker::doWorker(QObject *parent)
: QObject(parent)
{
m_thread = new QThread(this);
moveToThread(m_thread);
m_thread->start();
}
doWorker::~doWorker()
{
m_thread->quit();
m_thread->deleteLater();
}
void doWorker::slot_worker1()
{
qDebug() << "slot_worker1 " << QThread::currentThread()->currentThreadId();
for (int i = 0; i < 10000000; ++i)
{
qDebug() << "******************: "<< i;
}
}
moveToThread::moveToThread(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
m_worker1 = new doWorker;
connect(ui.pushButton,SIGNAL(clicked()),m_worker1,SLOT(slot_worker1()),Qt::QueuedConnection);
}
moveToThread::~moveToThread()
{
}
void moveToThread::on_pushButton_clicked()
{
qDebug() << "on_pushButton_clicked " << QThread::currentThreadId();
}
可以参考
重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread) - 苦涩的茶 - 博客园 (cnblogs.com)https://www.cnblogs.com/liushui-sky/p/5829563.html在Qt使用moveToThread() qt的线程 - 简书 (jianshu.com)
https://www.jianshu.com/p/9eee3c5208c4