Qt之多线程
源地址:http://blog.csdn.net/liuhongwei123888/article/details/6072320
Qt 是一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能。为了满足用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持。Qt 主要从三个方面对多线程编程提供支持:一、构造了一些基本的与平台无关的线程类;二、提交用户自定义事件的 Thread-safe 方式;三、多种线程间同步机制,如信号量,全局锁。
1、QThread
QThread提供了与平台无关的线程。一个QThread代表单独运行于程序的线程。它与进程中的其他线程共享数据,在多任务操作系统中单独运行。线程使用run()方法开始执行,在run()方法中调用exec()开始事件循环。我们可以通过继承QThread并且重写run()函数编写一个线程。例如:
- //mythread.h
- #ifndef MYTHREAD_H
- #define MYTHREAD_H
- #include <QThread>
- class MyThread : public QThread
- {
- public:
- MyThread();
- MyThread(int count);
- void run();
- private:
- int count;
- };
- #endif // MYTHREAD_H
- //mythread.cpp
- #include "mythread.h"
- #include "QThread"
- #include <QDebug>
- MyThread::MyThread()
- {
- }
- MyThread::MyThread(int count)
- {
- this->count = count;
- }
- void MyThread::run()
- {
- while(count<20000)//为了查看结果尽量设置大一些
- {
- qDebug()<< QThread::currentThread()->objectName()<<this->count++;
- }
- }
- //main.cpp
- #include <QtCore/QCoreApplication>
- #include "mythread.h"
- #include <QDebug>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- qDebug()<< "Main Start";
- MyThread myThread1(0);
- myThread1.setObjectName("MyThread1");
- myThread1.start();
- MyThread myThread2(0);
- myThread2.setObjectName("MyThread2");
- myThread2.start();
- int c = 0;
- while(c < 20000)//为了查看结果尽量设置大一些
- {
- qDebug()<< "Main Thread"<< c++;
- }
- return a.exec();
- }
在main函数中我定义了两个线程,并分别设置了线程名称。运行过程中有三个线程会可能同时运行。主函数线程,myThread1线程,myThread2线程。可以从运行结果看出:
g
Main Start
Main Thread 0
Main Thread 1
Main Thread 2
Main Thread 3
Main Thread 4
Main Thread 5
....
Main Thread 1040
Main Thread 1041
Main Thread 1042
Main Thread 1043
Main Thread 1044
"MyThread2" 0
"MyThread2" 1
"MyThread2" 2
"MyThread2" 3
"MyThread2" 4
"MyThread2" 5
"MyThread2" 6
.....
"MyThread2" 1158
"MyThread2" 1159
"MyThread2" 1160
"MyThread2" 1161
"MyThread2" 1162
"MyThread1" 0
"MyThread1" 1
"MyThread1" 2
"MyThread1" 3
"MyThread1" 4
"MyThread1" 5
.......
Main Thread 19990
Main Thread 19991
Main Thread 19992
Main Thread 19993
Main Thread 19994
Main Thread 19995
Main Thread 19996
Main Thread 19997
Main Thread 19998
Main Thread 19999
QThread包含一个枚举类型
enum Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, ..., InheritPriority } 这个枚举类型表示操作系统如何应安排新创建的线程
QThread::IdlePriority 0 安排只是CPU空闲时在运行
QThread::LowestPriority 1 安排最低优先级
QThread::LowPriority 2 安排低优先级
QThread::NormalPriority 3 安排正常优先级
QThread::HighPriority 4 安排高优先级
QThread::HighestPriority 5 安排高于最高.
QThread::TimeCriticalPriority 6 尽可能安排.
QThread::InheritPriority 7 安排使用继承父类优先级(默认)
公共方法:
QThread ( QObject * parent = 0 ) 构造函数,这个线程知道调用它的start函数时才会执行
~QThread () 析构函数
void exit ( int returnCode = 0 ) 调用此方法后,线程将退出事件循环并且返回从调用的QEventLoop::exec()的一个返回值
bool isFinished () const 返回线程是否已完成
bool isRunning () const 返回线程是否正在运行
Priority priority () const 返回线程的优先级.如果线程没有运行,将返回InheritPriority
void setPriority ( Priority priority ) 为正在运行的线程设置优先级,如果线程未运行,将不做任何操作,立即返回.
void setStackSize ( uint stackSize ) 设置线程栈的大小的最大值,如果在线程中进行递归调用,那么可以通过增加堆得大小来保证递归不会溢出。
uint stackSize () const 返回当前线程栈的最大值
bool wait ( unsigned long time = ULONG_MAX )阻塞线程直到线程结束运行或Time已经过去
槽:
void quit () 退出事件循环,等同于调用线程的exit(0),如果线程没有事件循环则什么也不做。
void start ( Priority priority = InheritPriority )开始执行线程
void terminate () 终止线程,线程是否立即被终止,依赖于操作系统.警告:这个函数是危险地,不被鼓励使用
信号:
void finished () 当线程结束运行时此信号被发射
void started () 当线程开始运行时此信号被发射
void terminated () 当线程被终止时此信号被发射
静态成员:
QThread * currentThread () 返回指向当前线程的指针
Qt::HANDLE currentThreadId () 返回当前线程的句柄
int idealThreadCount () 返回当前操作系统能运行线程的数量
void yieldCurrentThread () 让出CPU给其他线程,对于运行哪个线程完全决定于操作系统。
2、QRunnable
QRunable是所有可运行对象的基类。代表需要执行的一个任务或一段代码的接口。可以通过QThreadPool单独执行线程。QThreadPool可以自动删除QRunable如果此可运行对象的autoDelete()方法返回ture的话。我们可以使用setAutoDelete()函数设置auto-deletion标识.
总之QRunnable提供了简洁有效的可运行对象的创建
优点: 创建过程简洁, 使用方便, 配合着自身的autoDelete特性, 有点“招之即来, 挥之即去”的感觉.
缺点: 无法实时提供自身的运行状态.
3、QThreadPool
线程池,用于管理一个线程的集和。
线程池用于管理和回收线程对象以减少程序中创建线程的花费。
每个Qt应用都有一个全局的QThreadPool对象,通过QThreadPool::globalInstance()获取
属性:
activeThreadCount : const int 线程池中活动的线程个数
expiryTimeout : int 线程经过expiryTimeout未被使用将被认为expired并且exit。这种线程可以重新被restart.默认过期时间是30000毫秒即30秒。如果过期时间设置为负的,那么被创建的线程将永远不会exit直到线程池销毁。设置过期时间不会影响到已经在运行的线程。只有新创建的线程使用这个过期时间。因此推荐在创建线程池后立即设置过期时间.
maxThreadCount : int 线程池中允许最大的线程数量。线程池最少允许一个线程,即使这个值被设置为0或负数.默认的最大线程数量是QThread::idealThreadCount()
公共方法:
QThreadPool ( QObject * parent = 0 )
~QThreadPool ()
int activeThreadCount () const 返回activeThreadCount属性值
int expiryTimeout () const 返回expiryTimeout属性值
int maxThreadCount () const 返回maxThreadCount属性值
void releaseThread ()
void reserveThread () 存储一个线程,
void setExpiryTimeout ( int expiryTimeout )
void setMaxThreadCount ( int maxThreadCount )
void start ( QRunnable * runnable, int priority = 0 ) 存储一个线程并且运行可执行对象并且将可执行对象加入到运行队列中,如果这个线程没有使当前线程数超过最大线程数。
bool tryStart ( QRunnable * runnable ) 尝试存储一个线程并且运行可执行对象。如果没有这时没有时间片可以运行线程,那么这个方法将什么也不做。否则这个可执行对象线程将使用一个可运行线程立即运行。
void waitForDone () 等待所有线程退出,并且移除所有线程池中线程.
静态函数
QThreadPool * QThreadPool::globalInstance () 获取全局线程对象
QThreadPool::globalInstance()->start(Runable实例);
Qt之多线程的更多相关文章
- Qt搭建多线程Server
起因是MySQL在Android上没有驱动.也就是说,移动端想要访问远程数据库,必须通过一台(或多台)PC进行中转. 中转PC作为Server,接受来自移动端Socket访问数据库的要求,Server ...
- qt中多线程用法总结
1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...
- 基于QT的多线程server
// thread.cpp #include "thread.h" Thread::Thread(int socketDescriptor, QObject *parent) : ...
- QT:多线程HTTP下载文件
这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器 ...
- qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)
Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的几乎国内没有 ...
- Qt在多线程中使用信号槽的示例
之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出. 首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行, ...
- Qt中多线程问题
1. 出现的问题 编写视频解码器程序时,把解码那部分单独置于一个线程中进行处理,后来实际应用到项目中发现内存泄漏很严重 问题就出现在多线程中,每次视频解码器程序关闭时首先必须释放其所涉及的堆空间, 由 ...
- Qt的多线程总结以及使用(一)
Qt提供QThread类以进行多任务的处理.Qt提供的线程可以做到单个进程做不到的事情.在这里实现最简单的一个多线程.最简单的线程的基类为QThread,然后需要重写QThread的run(),在ru ...
- 【原创】QT编程 多线程
请先保证已安装QT,没有请参考 http://www.cnblogs.com/kavs/p/4608926.html 安装QT. 新建threads文件夹存放项目:mkdir threads sud ...
随机推荐
- iOS学习之NSAttributedString(富文本)
NSAttributedString 叫做富文本,是一种带有属性的字符串,通过它可以轻松的在一个字符串中表现出多种字体.字号.字体大小等各不相同的风格,还可以对段落进行格式化,一般都是对可变富文本(N ...
- Memcached初体验及原理解说
1.简单介绍 Memcached 是一个 高性能的 分布式 内存对象缓存系统,用于动态Web应用降低数据库负载,提升性能. 2.试用场景 1.变化频繁,具有不稳定性的数据 (比方用户在线状态.在线人数 ...
- ThinkPHP - 连贯操作 - 【实现机制】
<?php //模型类 class Model { //数据库连接 private $_conn = NULL; //where语句 private $_where = NULL; //表名称 ...
- javascript学习(10)——[知识储备]链式调用
上次我们简单的说了下单例的用法,这个也是在我们java中比较常见的设计模式. 今天简单说下链式调用,可能有很多人并没有听过链式调用,但是其实只要我简单的说下的话,你肯定基本上都在用,大家熟知的jQue ...
- 多玩YY聊天记录解析全过程
再来一发,现在开始! 下载安装YY,观察YY目录,很明显的发现了sqlite3.dll,这个数据库很多很多很多软件都在用,简单小巧且开源.删除sqlite3.dll 进入YY,历史记录不能正常显示,基 ...
- 区间重合判断(pojg校门外的树)
pojg:http://poj.grids.cn/practice/2808 解法1:以空间换时间: #include<stdio.h> #include<string.h> ...
- 【Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色】玛萨玛索男装网购商城
[Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色]玛萨玛索男装网购商城 [特价商品] Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款 ...
- 金融管理 - MBA智库百科
金融管理 - MBA智库百科 金融管理 出自 MBA智库百科(http://wiki.mbalib.com/) 金融管理(Financial Management) 目录 ...
- 使用线程新建WPF窗体(公用进度条窗体)
使用线程新建窗体 项目中需要一个公用的进度条窗体.大家知道在wpf中,有两个线程,一个是UI线程,另一个是监听线程(一直监听用户的输入).如果我们后台有阻塞UI线程的计算存在,那么界面上的比如进度条什 ...
- Eclipse中JBOSS5.1无法启动的问题解决办法
今天在Eclipse中启动JBoss 5.1时遇到这样的一个错误: …… ERROR [AbstractKernelController] Error installing to Instantiat ...