QT操作Excel时将读写功能置于子线程内存报错解决方案

     在程序设计和开发中,我们通常会将比较耗费CPU时间的操作放到子线程当中,从而避免主线程的阻塞,同时显现并行化。尤其是在QT这类涉及到GUI程序设计的程序。我们都知道,在QT中GUI线程占据着主线程,如果我们将那些比较耗费CPU时间的任务放到主线程中执行会导致GUI界面的卡顿或卡死现象的出现。

    基于这个原理,前段时间在开发QT读写Excel文件的时候,还是基于该策略,将Excel的读写操作放到子线程中。但是,实际运行过程中却会出现异常的内存报错,很是疑惑。尤其是,我在win10系统上开发和运行不会内存报错,发布到win7系统上就会内存报错。经过Google和Baidu的查询,找到解决问题的方法。

    报错的原因是:OLE组件的初始化和释放默认在GUI线程中已经实现了。在次线程中必须自己进行初始化和释放操作。因此,在Excel操作的子线程中要以如下的方式修改run()函数:

 

void run()
{
    HRESULT r = OleInitialize(0);
    if (r != S_OK && r != S_FALSE) {
        qWarning("Qt: Could not initialize OLE (error %x)", (unsigned int)r);
    }
    QAxObject * excelApplication = new QAxObject("Excel.Application");
    OleUninitialize();
}

注意:需要在头文件中加入#include "qt_windows.h"引用。

 


我们团队有着十几年的期货程序化交易算法与软件研发经验,基于C++ Qt技术研发了具有自主知识产权的期货智能程序化交易一体化系统平台,该平台封装了

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值