• 13689阅读
  • 11回复

[提问]QAxObject +多线程 + run [复制链接]

上一主题 下一主题
离线nashinianqin
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-14


各位高手好!
    小弟目前想在程序中实现一个文字转换成语音的功能,使用了QAxObject,在主线程中创建一个对象,就可以正常使用,代码如下在:
QAxObject speak("SAPI.SpVoice");
speak.dynamicCall("Speak(QString)", "12334");

但是由于在主线程中创建QAxObject对象并调用的话,会造成界面假死,后来在线程中创建QAxObject 并调用,但是却存在初始化问题,无法正常工作,在网上查了很多信息,说是使用COM控件时必须进行初始化::CoInitialize(NULL);结束的时候使用CoUnInitialize() 收回COM库,描述如下

  • 首先调用 CoInitialize(NULL) 初始化COM库

  • CoCreateInstance(....) 创建COM对象并获得接口使用
  • 使用
  • 释放COM对象

最后 CoUnInitialize() 收回COM库

现在有一个问题啊,我在Qt中没有查找到CoInitialize 和CoUnInitialize 这两个函数,请问怎么在Qt的线程中初始化COM

还有一个问题是,我刚才做了一个实验,QAxObject对象依然是在线程中声明的,然后写了一个函数,让其由主线程调用,可以正常使用,但是放在run函数中调用时就会出问题,不能正常使用,给出一个提示,QAxBase: Error calling IDispatch member Speak: Exception thrown by server
Code : 496Source :
Description: Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception
谁知道为什么啊
离线nashinianqin
只看该作者 1楼 发表于: 2011-06-14
希望各位大侠不吝赐教,目前的问题是,如果在线程入口函数中调用QAxObject对象,就会报错,谁知道什么原因,怎么解决啊
离线dbzhang800

只看该作者 2楼 发表于: 2011-06-14
引用第1楼nashinianqin于2011-06-14 10:29发表的  :
希望各位大侠不吝赐教,目前的问题是,如果在线程入口函数中调用QAxObject对象,就会报错,谁知道什么原因,怎么解决啊

系统api,包含相应的头文件即可。

CoIn....  CoUnIn... 分别在刚进入QThread::run 和 将退出 QThread::run 时调用。
离线nashinianqin
只看该作者 3楼 发表于: 2011-06-14
非常感谢DB兄,现在有个问题是,::CoInitialize(NULL)和CoUnInitialize() 这两个函数,好像QT中没有啊,具体怎么调用呢?这个我很困惑,我看见很多人都说调用::CoInitialize(NULL)和CoUnInitialize() ,可是我写进程序就报错,编译通不过,查帮助文档,也没看见这两个函数,还请DB兄说明,怎么调用这两个函数
离线nashinianqin
只看该作者 4楼 发表于: 2011-06-14
系统api,包含相应的头文件即可。
?????

这个头文件是什么,怎么查不到呢??????????
离线morriszy

只看该作者 5楼 发表于: 2011-06-14
是不是 #include <windows.h> 呀
VS2010+Qt4.7.0
离线nashinianqin
只看该作者 6楼 发表于: 2011-06-14
呵呵,我在qt 4.7.0中包含#include <windows.h>,直接报错
离线morriszy

只看该作者 7楼 发表于: 2011-06-14
回 6楼(nashinianqin) 的帖子
报错讯息发上来看看呢
VS2010+Qt4.7.0
离线nashinianqin
只看该作者 8楼 发表于: 2011-06-14
我写了两个程序,一个包含#include <Windows.h>可以通过编译,也像你们说的,可以CoInitialize,但是,另一个程序就编译不通过,提示错误syntax error : 'constant',哭死
离线XChinux

只看该作者 9楼 发表于: 2011-06-14
确实是这样的,在线程中要自己加那两个初始化相关的调用。
不过你调用语音方面是否频繁?你可以变通一下,将语音发声音做成一个单独的.exe文件,然后在需要的地方用QProcess::startDetached()来调用,即变线程执行改为进程执行,这样你的问题就好好解决了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线nashinianqin
只看该作者 10楼 发表于: 2011-06-14
回 9楼(XChinux) 的帖子
不会很频繁,不过需要周期性检查而已,存在问题时报警即可,谢谢大家,目前的问题基本解决,我再查一下,为啥#include <Windows.h>出错,非常感谢各位。
离线nashinianqin
只看该作者 11楼 发表于: 2011-06-14
结果一找到,有宏定义冲突,呵呵,现在终于好了,感谢各位老大,由衷的感谢
快速回复
限100 字节
 
上一个 下一个