Qt中多线程moveToThread

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)icon-default.png?t=M276https://www.cnblogs.com/liushui-sky/p/5829563.html在Qt使用moveToThread() qt的线程 - 简书 (jianshu.com)icon-default.png?t=M276https://www.jianshu.com/p/9eee3c5208c4

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值