Fortran Coder

查看: 6473|回复: 4
打印 上一主题 下一主题

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

[复制链接]

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
跳转到指定楼层
楼主
发表于 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","程序已完成!");      
  }




分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
沙发
发表于 2019-9-2 13:08:57 | 只看该作者
QThread 了解一下~
把调用 Fortran 的语句放到 QThread 对象的 run 函数里就可以了。

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
板凳
 楼主| 发表于 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界面的参数
}

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
地板
发表于 2019-9-3 13:34:16 | 只看该作者
QThread 的构造函数可以从外界获得参数

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
5#
 楼主| 发表于 2019-9-4 19:34:05 | 只看该作者
vvt 发表于 2019-9-3 13:34
QThread 的构造函数可以从外界获得参数

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 10:32

Powered by Tencent X3.4

© 2013-2024 Tencent

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