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

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

1 初始化

头文件

调用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资源释放同样需遵循同一线程原则,否则退出程序时会出错

你可能感兴趣的:(C++,/,QT,多线程,c++,thread)