QAXObject在多线程中的初始化及调用问题

QT调用windows的excel,word时会用到QAxObject类,如果文件比较大的话会考虑使用多线程,将处理excel的代码放到非主线程中执行。这种情况下,初始化及调用需要谨慎,切记:初始化及调用的代码必须放在同一个线程中!

1 初始化

头文件<windows.h>

调用CoInitializeEx(nullptr, COINIT_MULTITHREADED);

如果是重写QThread::run函数,初始化一定要放在run函数中,因为除了run函数其他代码都是运行在主线程中的,如果放其他地方,初始化会失败,错误提示:

CoCreateInstance failure (尚未调用 CoInitialize。)

QAxBase::setControl: requested control Excel.Application could not be instantiated

QAxBase::dynamicCallHelper: Object is not initialized, or initialization failed

QAxBase::dynamicCallHelper: Object is not initialized, or initialization failed

 

同样道理,使用QObject:moveToThread时,QObject的对象肯定是在主线程中创建的,所以也不能在QObject对象的构造函数中初始化QAxObject.

 

2 调用

QAxObject类中的函数调用必须遵循哪个线程创建就在哪个线程中使用,否则会失败,错误提示:

QAxBase::dynamicCallHelper: Object does not support automation

 

3 QAxObject资源释放同样需遵循同一线程原则,否则退出程序时会出错

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视图猿人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值