问题表述:一个主线程和两个子线程,两个子线程进行写EXCEL表格文件,线程1写demo_1.xlsx,线程2写demo_2.xlsx,运行一段时间后程序异常退出?。代码如下:
//两个线程代码一样,只是写入的文件名不同
QXlsx::Document document("demo_x.xlsx");
int rowLen = document.dimension().rowCount();
QString strA = "A" + QString::number(rowLen+1,10);
QString strB = "B" + QString::number(rowLen+1,10);
QString strC = "C" + QString::number(rowLen+1,10);
QString strD = "D" + QString::number(rowLen+1,10);
QString strE = "E" + QString::number(rowLen+1,10);
QString strF = "F" + QString::number(rowLen+1,10);
QString strG = "G" + QString::number(rowLen+1,10);
QString strH = "H" + QString::number(rowLen+1,10);
QString strI = "I" + QString::number(rowLen+1,10);
document.write(strA,temp.DateTime);
document.write(strB,temp.Temp1);
document.write(strC,temp.Temp2);
document.write(strD,temp.Temp3);
document.write(strE,temp.Temp4);
document.write(strF,temp.Temp5);
document.write(strG,temp.Temp6);
document.write(strH,temp.Temp7);
document.write(strI,temp.Temp8);
document.save();
线程开启后,运行一段时间写操作程序异常退出,没有任何提示。。。
调试模式下在运行一次,发现程序输出栏出现一行提示:Invalid address specified to RtlFreeHeap( 03900000, 19E7A950 ),并定位在qmap.h文件内
网上搜了一下,说是什么内存访问错误,导致程序试图释放一个非法的堆内存地址,从而出现了异常。。。。
比较菜,搜索了半天也不知道到底是什么原因导致,可能QXlsx不是这么用的,于是我就开了一个线程来进行写操作,就不会发生程序异常退出这种情况,只要我把两个线程都打开一起写操作,虽然两个线程写的也不是同一个文件,但是就是会异常退出;
Qxlsx写时会调用QZipWriter,不知到有没有关系
抓耳挠腮了半天。。。。
最后得出结论:QXlsx只能在同一个线程内进行写操作(不知道对不对,我自己瞎猜的),就算每个线程写的都不是同一个文件,不知道为啥,希望有大佬看到能帮忙解答一下
解决方法:就是把写操作都放在一个线程上,读操作还没试