最近学习qt,一些细节备忘

来源:互联网 发布:台北故宫知乎 编辑:程序博客网 时间:2024/05/21 04:23

1、项目需要阅读功能,但发现直接将模块放在主线程中会导致卡顿,因此使用Qthread创建阅读子线程。阅读代码放在子线程run中,由while循环检测,阅读完成后关闭子线程quit()时,发现cpu资源没有被释放,后在http://bbs.csdn.net/topics/390064131中找到答案,最终采纳3楼意见,解决此问题。“如果是使用了exec()的话,可以使用: quit();wait(); 退出线程,如果是一个类似while一直循环的话,最好是设置一个bool变量控制,让线程安全退出run函数。”

2、阅读模块放在子线程时,不能直接调用QAxObject *speaker = new QAxObject("SAPI.SpVoice");  speaker->dynamicCall("Speak(QString)", text); 因为子线程不会对com组件进行配置,正确方式为:                                                                                                                                                                   HRESULT r = OleInitialize(0);
if (r != S_OK && r != S_FALSE)

 {
qWarning("Qt: Could not initialize OLE (error %x)", (unsigned int)r);
}
QAxObject *speaker = new QAxObject("SAPI.SpVoice");
speaker->dynamicCall("Speak(QString)", text);
OleUninitialize();

3、子线程在主线程中初始化,子线程中的slot函数不会在子线程中运行。

因为QTherad是用来管理线程的,他所依附的线程和他管理的线程并不是同一个东西;

QThread所依附的线程,是执行QThread t(0)或QThread *t = new QThread(0)的线程,一般是咱们的主线程;

QThread管理的线程,就是run启动的线程,也就是子线程;

Qthread的对象依附在主线程中,所以他的slot函数会在主线程中执行,而不是子线程。

如果想让槽函数slot在次线程运行(比如它执行耗时的操作,会让主线程死掉),怎么解决呢?

定义一个普通的QObject派生类,然后将其对象move到QThread中。使用信号和槽时根本不用考虑多线程的存在。也不用使用QMutex来进行同步,Qt的事件循环会自己自动处理好这个。

具体参看:http://www.360doc.com/content/12/0306/09/6828497_192123197.shtml

1 0
原创粉丝点击