首页 > 其他分享 >记录一次QT5下多线程使用Qxlsx操作写EXCEL表文件问题

记录一次QT5下多线程使用Qxlsx操作写EXCEL表文件问题

时间:2023-06-03 17:22:27浏览次数:35  
标签:Qxlsx QT5 temp number rowLen 线程 QString 多线程 document

问题表述:一个主线程和两个子线程,两个子线程进行写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只能在同一个线程内进行写操作(不知道对不对,我自己瞎猜的),就算每个线程写的都不是同一个文件,不知道为啥,希望有大佬看到能帮忙解答一下
解决方法:就是把写操作都放在一个线程上,读操作还没试

标签:Qxlsx,QT5,temp,number,rowLen,线程,QString,多线程,document
From: https://www.cnblogs.com/ruandahua/p/17454264.html

相关文章

  • 【python】多线程
     在Python3中,通过threading模块提供线程的功能。原来的thread模块已废弃。但是threading模块中有个Thread类(大写的T,类名),是模块中最主要的线程类,一定要分清楚了,千万不要搞混了。threading模块提供了一些比较实用的方法或者属性,例如:方法与属性描述current_thread()返......
  • 集合,多线程,面向对象,方法覆盖
    集合:“父亲”collection"儿子":list:有序,有下标,查set:无序,无下标,修改(底层:内存存储方式)列表,不方便map:键值对,key(标号)-value(真实的值,储放的是分散的物品,小型数据库)多线程:进程(可以索取计算机运行资源)=多线程(不可以索取,只能进程的资源)oop面向对象=封装,继承,多态面向过程:按照......
  • qt 一直提示找不到 libQt5Sql.so.5 库
    报错提示: 背景:1.在ubuntu下,编译了一套开源库,用的是qt5.92.但是qt5.9特别不好用,我换成了qt5.14.2,但是担心会不会报错,因为编译开源库用到的是qt5.9的库 编译工程1.一直报上面那个错2.其他错误倒没有 解决:1.参考原文链接2.我的修改:添加变量LD_LIBRARY_PATH......
  • 多线程的未捕获异常类 UncaughtExceptionHandler 的使用
    一、需要UncaughtExceptionHandler的原因1.主线程可轻松的发现异常,子线程的异常比较隐蔽,难以发现程序运行时,子线程发生了异常,并不影响主线程,也不会终止主线程的程序,主线程将继续执行,这时候子线程的异常可能就不会被察觉,就使得子线程的功能出了问题,但没发现。代码展示:/***......
  • 多线程安全的案例展示与解决方案
    一、概念1.什么是线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。通俗来说就是:不管业务中遇到怎么的多个线......
  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图接下来看......
  • SpringCloud大文件分片上传/多线程上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • win 10 Qt5.15.2安装
    Qt简介截止今天,Qt长期支持的版本只有Qt5.15、Qt6.2和Qt6.5。在Qt6.5版本,在新版本中有许多类被聚合,有些函数发生改变。当然6.5也更强大了,有了更丰富的接口和函数,让使用者能更加便利和快速的开发。但是我今天所讲述的并不是Qt6.5,而是Qt5.15.2的安装。Qt安装Qt已经放......
  • 不使用第三方框架编写的多线程断线续传功能
    一、背景最近需要个断线续传功能,但是觉得一些框架不太适合,所以基于原理编写了一个多线程断线续传功能支持技术分享,但是复制和转发我的博客时候请标明出处,谢谢 javascript:void(0)二、断线续传的个人理解:1、断线续传在个人理解,其实就是在出现正常下载流程之外的事情的时候,保存好当......
  • SpringBoot大文件分片上传/多线程上传
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......