一. 内容简介
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();
}
}