一. 内容简介
QT多线程调用matlab几种情况测试,无法同时调用多个matlab执行
二. 软件环境
2.1QT 5.14.1
新版QT6.4,,6.5在线安装经常失败,而5.9版本又无法编译64位程序,所以就采用5.14.1这个用的比较多也比较稳定的一个版本。
QT编译器采用的是MSVC2017 64bit。
链接:https://pan.baidu.com/s/1ER98DPAkTUPlIyCC6osNNQ?pwd=1234
2.2 MatlabR2022b(64位)
2.3 Visual studio 2017
Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。
2.4 测试代码
链接:链接:https://pan.baidu.com/s/1tNBFa4OCE5ORUuhRCOvhpg?pwd=1234
三.主要流程
3.1 用matlab代码生成三个lib库,并且添入项目里面,完成多线程调用
3.2 测试过程以及结果分析
四.具体步骤
4.1 用matlab代码生成三个lib库,并且添入项目里面
创建三个文件,thread_1,thread_2,thread_3,代码如下,都相同,里面是延时函数,由输入决定
function matAdd(A)
t1=clock;
while 1
t2=clock;
if etime(t2,t1)>=A
break
end
end
end
创建三个线程对象,这三个线程对象执行时间都在20秒左右。
class myThread_1 : public QRunnable
{
void run() override
{
qDebug() << "myThread_1" << str <<"start";
QTime time;
time.start();
double para1,para2;
para1=20;
para2=20;
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=0;//输出变量个数
thread_1(a);//C=A+B
qDebug() << "myThread_1" << str <<"end" << "-time" << time.elapsed();
}
QString str;
public:
myThread_1(QString s){
this->str = s;
}
};
class myThread_2 : public QRunnable
{
void run() override
{
qDebug() << "myThread_2" << str <<"start";
QTime time;
time.start();
double para1,para2;
para1=20;
para2=20;
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=0;//输出变量个数
thread_2(a);//C=A+B
qDebug() << "myThread_2" << str <<"end" << "-time" << time.elapsed();
}
QString str;
public:
myThread_2(QString s){
this->str = s;
}
};
class myThread_3 : public QRunnable
{
void run() override
{
qDebug() << "myThread_3" << str <<"start";
QTime time;
time.start();
double para1,para2;
para1=20;
para2=20;
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=0;//输出变量个数
thread_3(a);//C=A+B
qDebug() << "myThread_3" << str <<"end" << "-time" << time.elapsed();
}
QString str;
public:
myThread_3(QString s){
this->str = s;
}
};
按钮事件添加代码
QThreadPool pool;
pool.setMaxThreadCount(15);
pool.setExpiryTimeout(-1);
QStringList list;
list << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "8" << "9" << "10";
// 这块按测试修改
pool.start(new myThread_1(list[0]));
pool.start(new myThread_2(list[1]));
pool.start(new myThread_3(list[2]));
pool.waitForDone();
qDebug() << "--------------------------------------";
4.2 测试过程以及结果分析
第一次都用第一个thread_1这个matlab程序,调用三次,开始执行
pool.start(new myThread_1(list[0]));
pool.start(new myThread_1(list[1]));
pool.start(new myThread_1(list[2]));
可以看到其实还是一个一个在执行,说明他们在排队等这个thread_1这个程序,
然后进行第二次测试,每一个线程都单独调用一个thread程序,然后执行
pool.start(new myThread_1(list[0]));
pool.start(new myThread_2(list[1]));
pool.start(new myThread_3(list[2]));
然后来个对照的,将任务换一下,换成20秒延时,再执行
qDebug() << "myThread_1" << str <<"start";
QTime time;
time.start();
QDateTime n=QDateTime::currentDateTime();
QDateTime now;
do{
now=QDateTime::currentDateTime();
} while (n.secsTo(now)<=20);//20为需要延时的秒数
qDebug() << "myThread_1" << str <<"end" << "-time" << time.elapsed();
pool.start(new myThread_1(list[0]));
pool.start(new myThread_1(list[1]));
pool.start(new myThread_1(list[2]));
基本同时执行完成,那么就说明一个问题,qt调用matlab程序是没法用多线程的。