文章目录
- 前言
- 一、处理方式?
- 二、使用步骤
- 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);