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

23 篇文章 1 订阅

     在程序设计和开发中,我们通常会将比较耗费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技术研发了具有自主知识产权的期货智能程序化交易一体化系统平台,该平台封装了二百多个量化指标,具有低时延、高性能、小滑点、可定制和跨平台的特点。团队致力于将人工智能技术与传统的程序化交易技术相结合为客户提供灵活可定制的期货智能程序化交易服务和产品。

       

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

    阿科

   2017年5月1日

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt 中,线程写文件需要注意一些问题。 首先,线程不能直接访问 GUI 线程中的 UI 控件,因为 UI 控件只能在主线程中被访问。因此,在线程中进行文件操作,应该使用信号与槽机制将文件操作的结果传递给主线程,在主线程中进行 UI 更新。 其次,如果在线程中打开了文件,需要在线程中进行文件的写入操作。如果在主线程中打开了文件,那么在线程中进行文件的写入操作,可能会出现 “device not open” 的错误。 下面是一个在线程中写文件的示例代码: ```cpp // MyWorkerThread.h #include <QThread> #include <QFile> class MyWorkerThread : public QThread { Q_OBJECT public: MyWorkerThread(QObject *parent = nullptr); ~MyWorkerThread(); void run() override; signals: void finished(); void error(QString err); private: QFile m_file; }; // MyWorkerThread.cpp #include "MyWorkerThread.h" MyWorkerThread::MyWorkerThread(QObject *parent) : QThread(parent) { m_file.setFileName("test.txt"); } MyWorkerThread::~MyWorkerThread() { if (m_file.isOpen()) { m_file.close(); } } void MyWorkerThread::run() { if (!m_file.open(QIODevice::WriteOnly)) { emit error("Failed to open file."); return; } QTextStream out(&m_file); out << "Hello, World!" << endl; m_file.flush(); m_file.close(); emit finished(); } ``` 在上面的示例代码中,我们在线程中创建了一个 QFile 对象,然后在 run() 函数中打开了这个文件,写入了一些数据,并在结束关闭了文件。我们还定义了两个信号:finished() 和 error(),分别用于通知主线程操作完成和发生错误。 当然,你需要在主线程中创建一个 MyWorkerThread 对象,并将它的 finished() 和 error() 信号连接到相应的槽函数上。另外,在启动线程之前,你需要调用 moveToThread() 函数将 MyWorkerThread 对象移到线程中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值