您的位置:首页 > 编程语言 > Qt开发

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

2016-03-28 10:52 274 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt 子线程