最近学习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
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学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- Qt 5.6更新至RC版,最终版本近在咫尺
- C#实现窗体与子线程的交互的方法
- C#在子线程中更新窗口部件的写法
- Qt定时器和随机数详解
- Qt实现图片移动实例(图文教程)
- Qt for Android开发实例教程
- android开发教程之子线程中更新界面
- Android中子线程和UI线程通信详解
- QModelIndex/Role/Model介紹<二>
- 子线程更新UI(非Handle)
- 基于PyQt5的快速开发框架QFramer
- OSX下安装PyQt
- ok6410开发板移植DirectFB手记
- 【笔记】给Qt内嵌一个Chrome吧
- 【算法】最短路径之A*搜索
- 实现死锁的两种方式以及ReentrantLock的额外功能(未完待续)
- qt入门必备
- 在 Qt4 中使用 C++11