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