Fortran Coder

标题: 关于QT调用Fortran 后出现Qt界面无响应问题 [打印本页]

作者: 紫雪封尘    时间: 2019-9-2 09:18
标题: 关于QT调用Fortran 后出现Qt界面无响应问题
本帖最后由 紫雪封尘 于 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","程序已完成!");      
  }





作者: vvt    时间: 2019-9-2 13:08
QThread 了解一下~
把调用 Fortran 的语句放到 QThread 对象的 run 函数里就可以了。

作者: 紫雪封尘    时间: 2019-9-3 09:29
本帖最后由 紫雪封尘 于 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界面的参数
}

作者: vvt    时间: 2019-9-3 13:34
QThread 的构造函数可以从外界获得参数
作者: 紫雪封尘    时间: 2019-9-4 19:34
vvt 发表于 2019-9-3 13:34
QThread 的构造函数可以从外界获得参数

谢谢 老师,已解决 。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2