Qt程序主线程执行大量计算 界面卡顿,有什么方法优化?
2016-08-23 22:49
645 查看
来自知乎:http://www.zhihu.com/question/22992772
核心思想:前后台分离
永远不要用主线程做UI之外的任何事情!
方法一:
使用QThread,把逻辑功能打包到子线程。不要继承重写QThread::run,而是把逻辑功能封装为一个QObject,不要在类里写任何死循环,而是用基于信号槽的事件触发思想进行。
这个类里,const读函数允许直接调用,而会发生修改的比如写函数和控制函数,全部做成信号槽——这样的好处是你不需要做任何线程锁,Qt的信号槽会帮你处理好数据同步操作。但代价是信号槽操作为异步操作
方法二:
只跑一次的操作,比如异步操作一个函数,继承重写QRunnable,然后放进Qt的全局线程池里
方法三:
方法二比较麻烦,还要继承类。更方便的是用QtConcurrent模块,传一个函数指针和对应参数进去,就可以自动完成异步执行
作者:诸葛不亮
链接:http://www.zhihu.com/question/22992772/answer/118313056
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
////////////////////////////////
我们公司的代码规范,
要求主线程只能处理用户输入和界面。
甚至网络请求都必须单独开一个线程。
//////////////////////////////
Qt提供了并行计算的模块,实际上就是多线程,参考QtConnCurrent
//////////////////////////////
核心思想:前后台分离
永远不要用主线程做UI之外的任何事情!
方法一:
使用QThread,把逻辑功能打包到子线程。不要继承重写QThread::run,而是把逻辑功能封装为一个QObject,不要在类里写任何死循环,而是用基于信号槽的事件触发思想进行。
这个类里,const读函数允许直接调用,而会发生修改的比如写函数和控制函数,全部做成信号槽——这样的好处是你不需要做任何线程锁,Qt的信号槽会帮你处理好数据同步操作。但代价是信号槽操作为异步操作
方法二:
只跑一次的操作,比如异步操作一个函数,继承重写QRunnable,然后放进Qt的全局线程池里
方法三:
方法二比较麻烦,还要继承类。更方便的是用QtConcurrent模块,传一个函数指针和对应参数进去,就可以自动完成异步执行
作者:诸葛不亮
链接:http://www.zhihu.com/question/22992772/answer/118313056
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
////////////////////////////////
我们公司的代码规范,
要求主线程只能处理用户输入和界面。
甚至网络请求都必须单独开一个线程。
//////////////////////////////
Qt提供了并行计算的模块,实际上就是多线程,参考QtConnCurrent
//////////////////////////////
相关文章推荐
- 计算程序执行时间的方法
- C# TimeSpan类计算程序执行的时间及此类的其他常用方法
- C#计算程序执行过程花费时间的方法
- QT5.6+opencv2.49+vs2015生成的exe可执行程序打包方法
- 最简单解决c#在UI线程中执行耗时方法导致界面假死的方法
- c与java中计算程序执行时间的方法
- 如果程序需要创建大量的线程,要考虑用 root 用户执行这个程序。
- 程序界面假死的一种解决方法 - 线程
- object-c中创建线程的方法有哪些?在主线程中执行代码用什么方法?如果想要延时执行代码,用什么方法?
- QT程序界面在Ubuntu不同权限级别运行差异的解决方法
- 计算程序执行时间的方法
- 利用线程调用程序执行的方法!
- 当一个类被加载后,它的静态变量生命周期是什么,是整个应用程序执行结束(比如java web程序,从类加载到服务器关闭还是该线程执行完毕)还是别的什么?
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- 执行数据库查询时,如果要查询的数据有很多,假设有1000万条,用什么办法可以提高查询速率?在数据库方面或java代码方面有什么优化的方法
- 计算程序执行时间的方法
- Qt中同一个线程里,QTimer的timeout()信号相关的槽未执行完,会发生什么?
- 编写程序,实现读文件,计算方法执行平均时间
- 最简单解决c#在UI线程中执行耗时方法导致界面假死的方法
- Qt for Android 程序启动闪一下黑屏的优化方法