qt开发桌面程序,玄学问题,未解决,

一. 内容简介

qt开发桌面程序,玄学问题,未解决。写一个桌面,核心计算程序是调用matlab程序的,一开始没什么问题,自从开始做日志系统以后(读写文件),各种玄学问题就出来了,就都记录一下,以后面试可以讲一下。

二. 软件环境

2.1 QT 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.3 Visual studio 2017

Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。

三. 主要流程

3.1 玄学报错,输出错误信息

3.2 文件读写

四. 具体步骤

3.1 玄学报错,输出错误信息

这个报错信息给我看出心理阴影了。程序虽然里面要调用matlab但是是在点击事件里面的,再启动页面里面初始化了matlab程序,程序编译没报错,一运行就闪退,报下面的信息,假如把matlab初始化取消了,程序就一直白屏,然后闪退。只要编译没问题,闪退的话,都报这个错误

--------------------------------------------------------------------------------
             Access violation detected at 2023-03-23 21:20:17 +0800
--------------------------------------------------------------------------------

Configuration:
  Crash Decoding           : Disabled - No sandbox or build area path
  Crash Mode               : continue (default)
  Default Encoding         : GBK
  Deployed                 : true
  Graphics Driver          : Uninitialized hardware 
  Graphics card 1          : Intel Corporation ( 0x8086 ) Intel(R) UHD Graphics 770 Version 31.0.101.3358 (2022-8-4)
  Graphics card 2          : NVIDIA ( 0x10de ) NVIDIA GeForce GT 730 Version 27.21.14.5671 (2020-9-30)
  Java Version             : Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
  MATLAB Architecture      : win64
  MATLAB Entitlement ID    : Unknown
  MATLAB Root              : C:\Users\Lenovo\Desktop\1\111\R2022b
  MATLAB Version           : 9.13.0.2049777 (R2022b)
  OpenGL                   : hardware
  Operating System         : Microsoft Windows 10 涓撲笟鐗  Process ID               : 16860
  Processor ID             : x86 Family 6 Model 151 Stepping 2, GenuineIntel
  Session Key              : 942dbda9-497f-4bbf-9ec3-5ae1c23dc511
  Window System            : Version 10.0 (Build 19044)

Fault Count: 1


Abnormal termination:
Access violation

Current Thread: '' id 15552

Register State (from fault):
  RAX = fffffffffffffffe  RBX = 0000000000000000
  RCX = fffffffffffffffe  RDX = 0000000000000000
  RSP = 000000fa1632d0b0  RBP = 0000000000000000
  RSI = 000000fa1632d31c  RDI = 000000fa1632d35c
 
   R8 = 000002e9be649e00   R9 = 0000000000000001
  R10 = 0000000000008000  R11 = 000000fa1632ced0
  R12 = 0000000000000000  R13 = 0000000000000000
  R14 = 0000000000000000  R15 = 0000000000000000
 
  RIP = 00007fffaf67a60e  EFL = 00010202
 
   CS = 0033   FS = 0053   GS = 002b

Stack Trace (from fault):
[  0] 0x00007fffaf67a60e          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00304654 QStringRef::length+00171898
[  1] 0x00007fffaf67987d          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00301181 QStringRef::length+00168425
[  2] 0x00007fffaf67c767          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00313191 QStringRef::length+00180435
[  3] 0x00007fffaf68163b          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00333371 QStringRef::length+00200615
[  4] 0x00007fffaf6747b5          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00280501 QStringRef::length+00147745
[  5] 0x00007fffaf681666          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00333414 QStringRef::length+00200658
[  6] 0x00007fffaf67ebf6          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00322550 QStringRef::length+00189794
[  7] 0x00007fffaf6761ff          D:\qt\5.14.1\msvc2017_64\bin\Qt5Cored.dll+00287231 QStringRef::length+00154475
[  8] 0x00007ff6e74406eb C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00067307 MainWindow::Operation+00000123
[  9] 0x00007ff6e7435d06 C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00023814 MainWindow::MainWindow+00000646
[ 10] 0x00007ff6e7434809 C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00018441 main+00003001
[ 11] 0x00007ff6e746cc95 C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00248981 WinMain+00000245
[ 12] 0x00007ff6e746b3ad C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00242605 invoke_main+00000045
[ 13] 0x00007ff6e746b29e C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00242334 __scrt_common_main_seh+00000302
[ 14] 0x00007ff6e746b15e C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00242014 __scrt_common_main+00000014
[ 15] 0x00007ff6e746b439 C:\Users\Lenovo\Desktop\qtstudy\build-111-Desktop_Qt_5_14_1_MSVC2017_64bit-Debug\debug\111.exe+00242745 WinMainCRTStartup+00000009
[ 16] 0x00007ff83c367034                   C:\windows\System32\KERNEL32.DLL+00094260 BaseThreadInitThunk+00000020
[ 17] 0x00007ff83dec26a1                      C:\windows\SYSTEM32\ntdll.dll+00337569 RtlUserThreadStart+00000033

** This crash report has been saved to disk as C:\Users\Lenovo\AppData\Local\Temp\matlab_crash_dump.16860-1 **



MATLAB is exiting because of fatal error
21:20:17: 程序异常结束。

3.2 文件读写

我想给文件清空,本来一个只写操作就可以了,只写就一直报错(3.1的错误),而且写file.open(QIODevice::WriteOnly | QIODevice::Truncate);也是报错,最后非要在里面加一个语句,就下边的代码,试了好久出来的

void MainWindow::fileClear()
{
    
    
    file.open(QIODevice::WriteOnly | QIODevice::Truncate);
    if(file.isOpen())
    {
    
    
        QByteArray array;
        while( !file.atEnd())//判断是否读到文件尾
        {
    
    
            array = file.readLine(); //按行读,追加
        }
        file.close();
    }
}

在mainwindow构造函数里面用几次都没问题,但是在按钮点击事件里面超过两次就闪退,在其他函数就没问题,后边我单独搞了一个读写线程,解决了这个问题,但是为什么报错还是不明白

QString MainWindow::fileWrite(QString msg, QString model)
{
    
    
    file.open(QIODevice::WriteOnly | QIODevice::Append);
    if(!file.isOpen())
    {
    
    
        return "日志读取失败";
    }
    // 设置输出信息格式
    // QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);
    QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString current_date = QString("(%1)").arg(current_date_time);
   // QString message = QString("%1 %2 %3 %4").arg(text).arg(context_info).arg(msg).arg(current_date);
    QString message = QString("%1 %2: %3").arg(current_date).arg(model).arg(msg);
    // 输出信息至文件中(读写、追加形式)
    QTextStream text_stream(&file);
    text_stream << message << "\r\n";
    file.flush();
    file.close();
}

用代码读下边的这个文本,用sscanf函数读是比较方便的,玄学的就又来了,这个参数我是要按字符串的方式读出来的,不是读不出来,就是闪退,但是把字符串换成double就可以读出来了,搞了一天没解决,就一个一个读字符了

(2023-03-23 10:57:53) Operation: Program startup;
(2023-03-23 10:58:02) Operation: Start calculation;
(2023-03-23 10:58:02) Operation: Calculation-parameters: R = 0.0300000000 L = 0.0480000000 Rb = 0.0303000000 C = 0.0001000000 s = 0.0000000000 Rf = 0.0000000000 tb = 0.0000000000 R0 = 0.0000000000 M = 0.0000000000 Ks = 0.0000000000 n0 = 40000.0000000000 Ta = 298.0000000000 E = 0.4000000000 Pa = 101300.0000000000 P1 = 1.0000000000 u = 0.0000193200 N = 72.0000000000 model = 1.0000000000 ;
(2023-03-23 10:58:02) Operation: Start adding blank data to the database;
(2023-03-23 10:58:03) Operation: Database blank data added successfully,Start adding calculated parameters to the database;
(2023-03-23 10:58:03) Operation: Calculation parameter added successfully;
(2023-03-23 10:58:03) Operation: Call the maltab calculation program;
(2023-03-23 10:58:22) Operation: The matlab program calculation is completed,Data starts importing into the database;
(2023-03-23 10:58:24) Operation: The data import was successful,The overall calculation time is 22182 ms;
(2023-03-23 10:58:24) Operation: Calculation completed;
void MainWindow::fileRead1()
{
    
    
    int n = 0;
    QString sss[100];
    file.open(QIODevice::ReadOnly);
    QString b[100][18];
    if(file.isOpen())
    {
    
    
        QByteArray array;

        while( !file.atEnd())//判断是否读到文件尾
        {
    
    
            array = file.readLine(); //按行读,追加
            if(array.length()>300){
    
    
                sss[n] = array;
                n++;
            }
        }
        file.close();
    }
    QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
    QString current_date = QString("(%1)").arg(current_date_time);

    QFile f("./log.txt");
    f.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream text_stream(&f);
    text_stream << QString("%1 %2: %3").arg(current_date).arg("Debug").arg("------------") << "\r\n";
    f.flush();

    int h = 0;
    int ll = 0;
    int qqq[18][2];
    for(int i = 0;i<n;i++){
    
    
        ll = 0;
        h = 0;
        for(int q=0;q<sss[i].length();q++){
    
    
            // R
            if(sss[i][q] == "R"&&sss[i][q+1]==" "){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // L
            if(sss[i][q] == "L"&&sss[i][q+1]==" "){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // Rb
            if(sss[i][q] == "R"&&sss[i][q+1]=="b"){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // C
            if(sss[i][q] == "C"&&sss[i][q+1]==" "){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // s
            if(sss[i][q] == "s"&&sss[i][q+1]==" "){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // Rf
            if(sss[i][q] == "R"&&sss[i][q+1]=="f"){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // tb
            if(sss[i][q] == "t"&&sss[i][q+1]=="b"){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // R0
            if(sss[i][q] == "R"&&sss[i][q+1]=="0"){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // M
            if(sss[i][q] == "M"&&sss[i][q+1]==" "){
    
    
                qqq[ll][0] = q + 4;
                qqq[ll][1] = q + 15;
                if(sss[i][q+1]!=" "){
    
    
                    qqq[ll][0]++;
                    qqq[ll][1]++;
                }
                for (int j=qqq[ll][0];j<=qqq[ll][1];j++) {
    
    
                    b[i][ll][h] = sss[i][j];
                    h++;
                }
                h = 0;
                ll++;
            }
            // Ks
        }
    }
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][0]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][1]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][2]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][3]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][4]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][5]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][6]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][7]));
//    ui->bottom_console->appendPlainText(QString("%1").arg(b[5][8]));
}

又一个玄学,上边if会有一个成立,加trycatch就闪退,下边if有一个成立,不加trycatch就闪退,现在是可以运行,具体为啥不知道,就能运行的不要加,不能运行的加就可以运行

void MainWindow::fileRead()
{
    
    
    file.open(QIODevice::ReadOnly);
    QString input;
    // 离奇的很
    if(file.isOpen())
    {
    
    
        QByteArray array;
        while( !file.atEnd())//判断是否读到文件尾
        {
    
    
            array = file.readLine(); //按行读,追加
            input = array;

            if(array.length()==391){
    
    
                startCal++;
            }
            if(array.length()==57){
    
    
                endCal++;
//                ui->bottom_console->appendPlainText(QString("%1").arg("Calculation completed"));
            }
        }
        if(startCal==endCal){
    
    
                ui->bottom_console->appendPlainText(QString("%1").arg("程序上次正常运行"));
        }
        if((startCal-endCal)==1){
    
    
            ui->bottom_console->appendPlainText(QString("%1").arg("程序上次异常退出"));
        }
        try {
    
    
            if(startCal==endCal){
    
    
                    ui->bottom_console->appendPlainText(QString("%1").arg("程序上次正常运行"));
            }
            if((startCal-endCal)==1){
    
    
                ui->bottom_console->appendPlainText(QString("%1").arg("程序上次异常退出"));
            }
        } catch (int res) {
    
    
            ui->bottom_console->appendPlainText(QString("%1").arg("异常退出"));
        }
        file.close();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45179361/article/details/129657442