天天看点

耗时处理-QtConcurrent::run前言一、处理方式?

文章目录

  • 前言
  • 一、处理方式?
  • 二、使用步骤
    • 1.函数
    • 2.示例

前言

最近遇到项目问题是c++调用matlab的动态库,在加载初始化时耗费时间比较久

一、处理方式?

        以前处理方式都采用moveToThread开启线程处理,最近新看到新处理方式QtConcurrent::run来启动新线程。

        简单介绍下moveToThread方式实现:1.定义一个继承QObject的类A;2.处理事务逻辑函数假设为doWork();3.将类A的实例的对象a调用moveToThread(thread),QThread实例thread;4.绑定信号槽connect(thread, &QThread::started, a, &A::doWork);5.启动线程thread.start()。

二、使用步骤

1.函数介绍

QFuture<T> QtConcurrent::run(Function function, ...)
QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...)
           

function函数会在一个单独线程中进行,并且该线程取自全局QThreadPool。返回的QFuture可以用来查询函数是否运行、完成状态和function的返回值。

该函数需要用到Concurrent模块。

2.示例

代码如下(示例):

MyWaiting *pWait = new MyWaiting(this);    //等待界面函数
pWait->show();

QFuture<bool> future = QtConcurrent::run([=] {
        //处理函数
		if (LoadAlgorithmModel::getInstance()->setModelPath(strList))
			return true;
		return false; });
while (!future.isFinished())
{
	QApplication::processEvents(QEventLoop::AllEvents, 100);
}
pWait->close();
           

本就想着代码简洁因此采用的QtConCurrent::run函数,所以处理函数也采用lambda函数。

外部extern函数:

extern bool doWork(QStringList strList);

bool doWork(QStringList strList)
{
    if (LoadAlgorithmModel::getInstance()->setModelPath(strList))
		return true;
	return false; 
}
           

成员函数:

第一个参数必须是const引用或者一个指向该类示例的指针。

bool A::doWork(QStringList strList)
{
    if (LoadAlgorithmModel::getInstance()->setModelPath(strList))
			return true;
		return false; });
}

//调用
QFuture<bool> future = QtConcurrent::run(this, &A::doWork, strList);