• 6079阅读
  • 2回复

多线程调用COM错误! [复制链接]

上一主题 下一主题
离线hicjiajia
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-31
寒假没事就学了下语音识别(Microsoft Speech 5.1)开发,遇到一个麻烦。

一开始程序只有一个GUI主线程,调用COM对象的Speak()发音函数,可以正常发音;后来为了避免发音时GUI死掉的现象改成两个线程(一个GUI主线程,一个用来发音的线程),但是在次线程中无法发音,查了些资料说是多线程程序中,每个单独线程都要CoInitialize(NULL);来初始化COM库,我也照做了,但是仍然没有解决问题错误如下:
QAxBase: Error calling IDispatch member Speak: Exception thrown by server
Code       : 496
Source     :
Description:
Help       :
Connect to the exception(int,QString,QString,QString) signal to catch this exception

抛出的异常提示我连接一下exception信号来获取进一步的错误信息,于是我写了一个对应的槽函数:
void SOPThread::ERROR1(int code,QString source,QString disc,QString help)
{
    qDebug()<<"##################################";
    qDebug()<<code<<"\n";
    qDebug()<<source<<"\n";
    qDebug()<<disc<<"\n";
    qDebug()<<help<<"\n";
    qDebug()<<"##################################";
}

但是基本上没得到什么有用的东西,提示如下:
##################################
-1003617808

""

""

""

##################################

我在想是不是我的初始化COM库的地方有问题,还缺东西,请高手指点一下...
离线hicjiajia

只看该作者 1楼 发表于: 2011-01-31
呵呵,这个问题无意间被我解决了,我原本是把初始化COM库的代码CoInitialize(NULL);写在发音线程的构造函数中了,我万念俱灰之下把初始化代码CoInitialize(NULL);写在run()函数中居然搞定了!!!
离线downstairs

只看该作者 2楼 发表于: 2011-05-02
感谢分享
喜爱编程的猫头鹰
快速回复
限100 字节
 
上一个 下一个