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

来源:互联网 发布:网上的淘宝刷手可靠吗 编辑:程序博客网 时间:2024/05/19 01:07

     在程序设计和开发中,我们通常会将比较耗费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"引用。


    有问题欢迎一起讨论,QQ:33845995,Email:qinpanke@hpu.edu.cn

    阿科

   2017年5月1日

0 0