QT学习之多线程
【为什么要用多线程?】
传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应。这个问题可以用事件处理和多线程来解决。
【Linux有线程的概念吗?】
传统的UNIX系统也支持线程的概念,但一个进程里只允许有一个线程,这样多线程就是多进程。Linux下的Posix线程(pthreads)是一种轻量级的进程的移植性实现,线程的调度由内核完成,每个线程都有自己的编号。如果使用线程,总体消耗的系统资源较少,线程间通信也比较容易,在工程中推荐使用线程。
【使用多线程有什么好处?】
- 提高应用程序的响应速度。这对于开发图形界面程序尤其重要,当一个操作耗时很长时(比如大批量I/O或大量矩阵变换等CPU密集操作),整个系统都会等待这个操作,程序就不能响应键盘、鼠标、菜单等操作,而使用多线程技术可将耗时长的操作置于一个新的线程,从而避免上述问题。
- 使多CPU系统更加有效。当线程数不大于CPU数目时,操作系统可以调度不同的线程运行于不同的CPU上。
- 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为独立或半独立的运行部分,这样有利于程序的理解和
- 【QT的简单多线程】
- 简单实现:qt的多线程和java有着类似的地方:也是start和run两个函数执行。先是创建多个线程对象,每个对象中都会有一个run函数(运行程序),我们直接循环的调用start函数进行启动每个对象线程,这样就能实现多线程了。
- 代码示例:
- 【多线程的互斥方法】
- QT为多线程的互斥和同步机制提供了几个类,掌握好这几个类对于互斥和同步机制理解应该不是难事。
- 首先我们对互斥和同步机制必须有一定的了解,并且对于他们两个相关的一些常用名称必须知道是什么意思。(这些东西在操作系统中应该都有介绍)
- QMutex类:对互斥量进行处理
- 对互斥量进行处理,保护临界区的代码(利用lock和unlock进行上锁解锁操作,trylock操作尝试解锁)
- QMutexLocker类
- 简化互斥量的处理,在构造函数中接受一个QMutex对象并且将其锁定,在析构函数中进行解锁。这样就实现了锁的自动化处理,不用担心解锁问题(类似java)
- 信号量 Qsemaphore类
- 信号量可以获取多次,而互斥量只能锁定一次,信号量一般用来保护一定数量的同种资源(一个存储区的蛋糕数量(生产者消费者问题--环形缓冲区))
- 这个问题操作系统这么课上已经讲过很多次原理了,所以这里直接上代码了。
- 信号量实例:
- 线程等待与唤醒机制 QWaitCondition
- 允许线程在一定的条件下唤醒其他线程
- 代码实例:
- QT为多线程的互斥和同步机制提供了几个类,掌握好这几个类对于互斥和同步机制理解应该不是难事。
- 【多线程应用】
- 代码太长,不变贴出,见书本:421页左右
QT学习之多线程的更多相关文章
- Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)
QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线 ...
- Qt学习 之 多线程程序设计
QT通过三种形式提供了对线程的支持.它们各自是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为easy,并能充分利用多处理器机器的优势. ...
- Qt 学习之路 2(74):线程和 QObject
Home / Qt 学习之路 2 / Qt 学习之路 2(74):线程和 QObject Qt 学习之路 2(74):线程和 QObject 豆子 2013年12月3日 Qt 学习之路 2 2 ...
- Qt 学习之路 2(72):线程和事件循环
Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻> -- 有需求的话还需要进行专题学习 豆子 2013年11月24日 Qt 学习之路 2 34条评论 前面一章我 ...
- Qt 学习之路 2(71):线程简介
Qt 学习之路 2(71):线程简介 豆子 2013年11月18日 Qt 学习之路 2 30条评论 前面我们讨论了有关进程以及进程间通讯的相关问题,现在我们开始讨论线程.事实上,现代的程序中,使用线程 ...
- Qt 学习之路 2(70):进程间通信
Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...
- Qt 学习之路 2(40):隐式数据共享
Qt 学习之路 2(40):隐式数据共享 豆子 2013年1月21日 Qt 学习之路 2 14条评论 Qt 中许多 C++ 类使用了隐式数据共享技术,来最大化资源利用率和最小化拷贝时的资源消耗.当作为 ...
- Qt 学习之路 2(23):自定义事件
Qt 学习之路 2(23):自定义事件 豆子 2012年10月23日 Qt 学习之路 2 21条评论 尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的.例如, ...
- Qt 学习之路 2(6):Qt 模块简介
Home / Qt 学习之路 2 / Qt 学习之路 2(6):Qt 模块简介 豆子 2012年8月26日 Qt 学习之路 2 20条评论 Qt 5 与 Qt 4 最大的一个区别之一是底层架构 ...
随机推荐
- 什么是 MVC ?
本篇博客打算简单介绍一下MVC是什么,为接下来MVC的学习做一下铺垫. MVC是一种架构设计模式,是一种设计理念.是为了达到分层设计的目的,从而使代码解耦,便于维护和代码的复用.MVC是3个单词的缩写 ...
- JAVA访问控制变量、类变量、类方法
1.私有:同类中 2.默认:同包中的类 3.保护:同包中的类 子类中(继承性) 4.公有:无范围 创建子类并覆盖方法时,必须考虑原来方法的访问控制: 作为通用的规则,覆盖方法是,新方法的访问控制不能 ...
- Android 应用获取Jenkins编译的版本号
Android很多应用的版本号最后都带了编译的版本号.比如说V1.0.0.125,后边的125就通常使用每次编译之后build history的号码,它是逐次增加,这样就可以区分每个细分的编译版本号, ...
- Cloudstack 安装记录
一.条件要求 1.硬件支持虚拟化,并在BIOS中开启(Inter-VT设为 Enable). 2.Centos 6.5 x86_64 3.环境中的每台主机均为静态IP地址. 4.cloudstack安 ...
- MyBatis单个参数的动态语句引用
参考:http://blog.csdn.net/viviju1989/article/details/17071909 是当我们的参数为String时,在sql语句中#{name} 会去我们传进来的参 ...
- 用户从手机的浏览器访问www.baidu.com,看到的可能跟桌面PC电脑,是不太一样的网页效果,会更适合移动设备使用。请简要分析一下,实现这种网页区分显示的原因及技术原理。
手机的网速问题.屏幕大小.内存.CPU等.通过不同设备的特征,实现不同的网页展现或输出效果.根据useragent.屏幕大小信息.IP.网速.css media Query等原理,实现前端或后端的特征 ...
- VC6.0打开文件是卡死的解决办法
删除工程目录下的 .ncb .opt 文件,然后就OK了!
- jquery制作滚动条到一定位置触发
$(function(){ var nav=$(".nav"); //得到导航对象 var win=$(window); //得到窗口对象 var sc=$(document);/ ...
- python中的json的基本使用方法
在python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互,从而在很多时候,可以使用json数据格式作为程序之间的接口, #!/usr/bin/env ...
- 修改SecureCRT终端的Home和End功能键。
SecureCRT真是个不错的ssh客户端工具,但在使用时发现跟自己的一些使用习惯不符合,例如home.end.pageup.pagedown和delete等键. 默认情况下一些按键的功能如下: pa ...