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 

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

你可能感兴趣的:(Qt,心得体会,qt,开发语言)