Fortran Coder

查看: 53|回复: 4

[混编] 关于QT调用Fortran 后出现Qt界面无响应问题

[复制链接]

10

帖子

4

主题

0

精华

入门

F 币
62 元
贡献
26 点
发表于 2019-9-2 09:18:32 | 显示全部楼层 |阅读模式
本帖最后由 紫雪封尘 于 2019-9-2 14:59 编辑

  我用qt调用Fortran程序后,点击运行按钮,在程序运行时会出现界面无响应问题,在网上搜索需要多线程,可我的函数需要调用Fortran的dll,所以不是很懂怎么样把调用dll的函数放到子线程中去,请各位老师指教,不胜感激。 附qt程序如下:

void imput::on_pBrun_clicked()//如果点击运行按钮那么运行此函数
{    //调用 dll****************************************************************
typedef void(*QTSEG)(char*filesey,char* fileobs,char*filesx,char*filesy,char*filerx,char*filery,char*filetrace,int*ntrace,short int *nt,short int*dt,int,int,int,int,int,int,int);   
QLibrary dll("Dllsey_information.dll");//加载Dllsey_information.dll      
if(dll.load())     
   {      
        QString filesey,filesx,filesy,filerx,filery,fileobs,filetrace;           
        filesey=ui->LEsegy->text();     
        fileobs=ui->lineEditobs->text();         
        filesx=ui->lineEditsx->text();            
        filesy=ui->lineEditsy->text();            
        filerx=ui->lineEditrx->text();           
        filery=ui->lineEditry->text();           
        filetrace=ui->lineEdit_trace->text();   //用in来表示Fortran的dll中的函数   
        QTSEG in=(QTSEG)dll.resolve("SEG");                    
        short int nt;           
        short int dt;                  
        int ntrace;                    
       ntrace=ui->lineEdit_ntrace->text().toInt();                  
       nt=ui->lineEdit_nt->text().toShort();               
       dt=ui->lineEdit_dt->text().toShort();
       QByteArray fsey= filesey.toLocal8Bit();        
       QByteArray fobs= fileobs.toLocal8Bit();              
       QByteArray fsx= filesx.toLocal8Bit();                 
       QByteArray fsy= filesy.toLocal8Bit();               
       QByteArray frx= filerx.toLocal8Bit();              
       QByteArray fry= filery.toLocal8Bit();               
       QByteArray fntrace= filetrace.toLocal8Bit();            //调用Fortran的dll即in
       in(fsey.data(),fsx.data(),fsy.data(),frx.data(),fry.data(),fobs.data(),fntrace.data(),&ntrace,&nt,&dt,fsey.size(),fsx.size(),fsy.size(),frx.size(),fry.size(),fobs.size(),fntrace.size());
       QMessageBox::about(this,"Err","程序已完成!");      
  }




回复

使用道具 举报

708

帖子

0

主题

0

精华

大师

F 币
737 元
贡献
410 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-9-2 13:08:57 | 显示全部楼层
QThread 了解一下~
把调用 Fortran 的语句放到 QThread 对象的 run 函数里就可以了。

10

帖子

4

主题

0

精华

入门

F 币
62 元
贡献
26 点
 楼主| 发表于 2019-9-3 09:29:39 | 显示全部楼层
本帖最后由 紫雪封尘 于 2019-9-3 09:30 编辑
vvt 发表于 2019-9-2 13:08
QThread 了解一下~
把调用 Fortran 的语句放到 QThread 对象的 run 函数里就可以了。
...

您好 ,我在网上搜索了关于QThread的用法 ,但是关于调用Fortran 的语句需要从ui界面处得到参数,这些参数在run函数里面无法从ui界面里面得到 ,所以还是有些小问题 需要请教,怎么把参数传递到run函数里面啊。void WorkerThread::run()
{

    QString filesey,filesx,filesy,filerx,filery,fileobs,filetrace;
     filesey=ui->LEsegy->text();
     fileobs=ui->lineEditobs->text();
     filesx=ui->lineEditsx->text();
     filesy=ui->lineEditsy->text();
     filerx=ui->lineEditrx->text();
     filery=ui->lineEditry->text();
     filetrace=ui->lineEdit_trace->text();//这些ui处都显示错误 无法得到UI界面的参数
}

708

帖子

0

主题

0

精华

大师

F 币
737 元
贡献
410 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-9-3 13:34:16 | 显示全部楼层
QThread 的构造函数可以从外界获得参数

10

帖子

4

主题

0

精华

入门

F 币
62 元
贡献
26 点
 楼主| 发表于 2019-9-4 19:34:05 | 显示全部楼层
vvt 发表于 2019-9-3 13:34
QThread 的构造函数可以从外界获得参数

谢谢 老师,已解决 。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-9-21 17:28

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表