QT调用matlab多线程程序测试

一. 内容简介

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程序是没法用多线程的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值