QT线程(一):线程类
线程之间共享数据,但又单独执行;
QT线程QThread是平台无关的;
通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread;
1、线程优先级
总共8个优先级:线程优先级从上到下越来越高。
|
Constant |
Value |
Description |
|
QThread::IdlePriority |
0 |
scheduled only when no other threads are running. |
|
QThread::LowestPriority |
1 |
scheduled less often than LowPriority. |
|
QThread::LowPriority |
2 |
scheduled less often than NormalPriority. |
|
QThread::NormalPriority |
3 |
the default priority of the operating system. |
|
QThread::HighPriority |
4 |
scheduled more often than NormalPriority. |
|
QThread::HighestPriority |
5 |
scheduled more often than HighPriority. |
|
QThread::TimeCriticalPriority |
6 |
scheduled as often as possible. |
|
QThread::InheritPriority |
7 |
use the same priority as the creating thread. This is the default. |
2、线程管理
2.1、线程启动
|
void |
start ( Priority priority = InheritPriority ) 启动线程执行,启动后会发出started信号。 |
2.2、线程执行
|
int |
exec () 进入线程eventloop。 |
|
virtual void |
run () 线程入口。 |
2.3、线程退出
|
void |
quit () 相当于exit(0)。 |
|
void |
exit ( int returnCode = 0 ) 调用exit后,thread将退出event loop,并从exec返回,exec的返回值就是returnCode。 通常returnCode=0表示成功,其他值表示失败。 |
|
void |
terminate () 结束线程,线程是否立即终止取决于操作系统。 线程被终止时,所有等待该线程Finished的线程都将被唤醒。 terminate是否调用取决于setTerminationEnabled ( bool enabled = true )开关。 |
2.4、线程等待
|
void |
msleep ( unsigned long msecs ) |
|
void |
sleep ( unsigned long secs ) |
|
void |
usleep ( unsigned long usecs ) |
|
bool |
wait ( unsigned long time = ULONG_MAX ) 线程将会被阻塞,等待time毫秒。和sleep不同的是,如果线程退出,则wait会返回。
|
2.4、线程状态
|
bool |
isFinished () const 线程是否已退出。 |
|
bool |
isRunning () const 线程是否还处于运行态。 |
2.5、线程属性
|
Priority |
priority () const |
|
void |
setPriority ( Priority priority ) |
|
void |
setStackSize ( uint stackSize ) |
|
uint |
stackSize () const |
|
void |
setTerminationEnabled ( bool enabled = true ) 设置是否响应terminate()。 |
3、线程实例
当我们创建线程时,首先是从QThread派生类定义一个新的线程,然后再使用该线程时,创建该线程类的对象。
例如:
class MyThread : public QThread
{
protected:
void run(); /* 重载run */
};
void MyThread::run()
{
QTcpSocket socket;
socket.connectToHost(hostName, portNumber); /* 建立tcp连接 */
exec(); /* 进入事件循环 */
}
int main()
{
MyThread thread; /* 使用新创建的thread */
thread.start(); /* thread会执行run(),建立tcp连接并进入事件循环,直到thread终止退出事件循环 */
thread.wait(); /* 等待thread退出 */
return 0;
}
从QThread派生类时,需要重新实现QThread的虚函数run。
void QThread::run () [virtual protected]
该函数是线程的入口,当我们使用start()启动线程时,新线程就会执行run()。默认的run()函数就仅仅调用了exec()进入事件循环。
当然,定义自己的线程run()时,也可以不使用事件循环,
例如:
class Thread : public QThread
{
Q_OBJECT
public:
Thread();
void setMessage(const QString &message);
void stop();
protected:
void run();
private:
QString messageStr;
volatile bool stopped;
};
Thread::Thread()
{
stopped = false;
}
void Thread::run()
{
while (!stopped) /* 该thread就没有用到exec()进入事件循环 */
std::cerr << qPrintable(messageStr);
stopped = false;
std::cerr << std::endl;
}
void Thread::stop()
{
stopped = true;
}
QT线程(一):线程类的更多相关文章
- Qt 线程池QThreadPool类、QRunnable类
QThreadPool类 用来管理 QThreads.此类中的所有函数都是线程安全的. 主要属性: 1.activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThrea ...
- Qt学习笔记 线程(一)
Qt中的线程是与平台无关的 QThread 提供了创建一个新线程的方法 新建一个线程,继承QThread并重写它的run()当调用 start()函数时会调用重载的run()函数 例: #ifndef ...
- Qt入门(9)——Qt中的线程支持
Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...
- QT中的线程与事件循环理解(2)
1. Qt多线程与Qobject的关系 每一个 Qt 应用程序至少有一个事件循环,就是调用了QCoreApplication::exec()的那个事件循环.不过,QThread也可以开启事件循环.只不 ...
- QT中的线程与事件循环理解(1)
1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...
- Qt多线程-QThreadPool线程池与QRunnable
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable 本文地址:https:/ ...
- Qt QThread 线程创建,线程同步,线程通信 实例
1. 继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...
- <基于Qt与POSIX线程>多线程下载器的简易搭建
原创博客,转载请联系博主! 本项目已托管到本人Git远程库:https://github.com/yue9944882/Snow 项目目标 Major Functionality 开发环境: Ce ...
- Qt 进程和线程之三:线程同步、可重入与线程安全
一.同步线程方法 使用线程的目的是允许代码并行运行,但是有时线程必须停止并等待其他线程.例如,如果两个线程试图同时写入相同的变量,结果是不确定的,所以需要同步线程.同步线程是一种保护共享资源等数据的常 ...
- Java核心知识点学习----线程同步工具类,CyclicBarrier学习
线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...
随机推荐
- ANDROID_MARS学习笔记_S01原始版_020_Mp3player001_歌曲列表
一.项目设计 二.歌曲列表简介 1.利用java.net.HttpURLConnection以流的形式下载xml文件为String 2.自定义ContentHandler-->Mp3ListCo ...
- ANDROID_MARS学习笔记_S01原始版_018_SERVICE之Parcel
一.代码 1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...
- Windows 内核(WRK)编译
引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...
- 酷盘kanbox获得B轮2000万美元融资
和阿里近期收购以穷游.虾米为代表的一批小网站相似,酷盘也属于个人用户数量级别庞大,但商业模式并不明晰的企业.目前阿里巴巴集团旗下的阿里云公司拥有自己的云存储业务,其本身既有面向个人用户的产品,也有面向 ...
- 商务部公开微软持有的Android技术专利
微软与众多Android厂商签署了专利授权协议,但从来没有公开它持有多少项Android技术专利.出人意料的是,为了收购诺基亚手机业务,微软今年4月递交到中国商务部的文件中完整公开了它的Android ...
- 关于mIdleHandlers 空闲消息
模拟情况说明 创建一个handler对象 该handler持有的是主线程 1.先发送一个延时20秒的message what=35;2.紧接着又发送一个延时10秒的Runnable3.在该Runnab ...
- 编译安装nginx并修改版本头信息—参考实例
今天做实验的时候,想起我那台yum安装的nginx+php-fpm+mysql服务器上的nginx版本有点低了,并且还要加两个第3方模块,就去nginx官网下载了最新稳定版nginx-1.0.6,好了 ...
- apache开源项目--HydraBase
Facebook 在官方博客上宣布推出HBase数据库的升级版——HydraBase, Facebook是HBase的重度用户,Facebook的HBase数据库系统存储着Facebook的很多关键业 ...
- Jmeter:图形界面压力测试工具
Jmeter是一款强大的图形界面压力测试工具,完全用Java写成,关于Jmeter的介绍,网上其实有不少的文章,我原本是不想再重复写类似文章的,但我发现有些很关键性的,在我们测试中一定会用到的一些设置 ...
- POJ1680 Currency Exchange SPFA判正环
转载来源:優YoU http://user.qzone.qq.com/289065406/blog/1299337940 提示:关键在于反向利用Bellman-Ford算法 题目大意 有多种汇币,汇 ...