线程之间共享数据,但又单独执行;

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线程(一):线程类的更多相关文章

  1. Qt 线程池QThreadPool类、QRunnable类

    QThreadPool类 用来管理 QThreads.此类中的所有函数都是线程安全的. 主要属性: 1.activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThrea ...

  2. Qt学习笔记 线程(一)

    Qt中的线程是与平台无关的 QThread 提供了创建一个新线程的方法 新建一个线程,继承QThread并重写它的run()当调用 start()函数时会调用重载的run()函数 例: #ifndef ...

  3. Qt入门(9)——Qt中的线程支持

    Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...

  4. QT中的线程与事件循环理解(2)

    1. Qt多线程与Qobject的关系 每一个 Qt 应用程序至少有一个事件循环,就是调用了QCoreApplication::exec()的那个事件循环.不过,QThread也可以开启事件循环.只不 ...

  5. QT中的线程与事件循环理解(1)

    1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...

  6. Qt多线程-QThreadPool线程池与QRunnable

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable     本文地址:https:/ ...

  7. Qt QThread 线程创建,线程同步,线程通信 实例

    1.  继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...

  8. <基于Qt与POSIX线程>多线程下载器的简易搭建

    原创博客,转载请联系博主! 本项目已托管到本人Git远程库:https://github.com/yue9944882/Snow 项目目标  Major Functionality 开发环境:  Ce ...

  9. Qt 进程和线程之三:线程同步、可重入与线程安全

    一.同步线程方法 使用线程的目的是允许代码并行运行,但是有时线程必须停止并等待其他线程.例如,如果两个线程试图同时写入相同的变量,结果是不确定的,所以需要同步线程.同步线程是一种保护共享资源等数据的常 ...

  10. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

随机推荐

  1. 释放SQL Server占用的内存

    由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),Sql Server才会释放一点点内存.所以很多时候,我们会发现运行Sql Server ...

  2. Ubuntu10.10 安装scim

    Ubuntu10.10 上没有找到默认的输入法,所以要安装一个中文输入法,网上好多介绍的,但都 不怎么好用,下面参考http://blog.csdn.net/caodesheng110/article ...

  3. Android Service的生命周期

    service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...

  4. Form – 保存自動關閉當前窗口

    FAQ: 在BUTTON的触发器中,写如下代码, commit_form; go_bloack('你想显示的那个window的block'); --或者写 show_view('你要显示的canvas ...

  5. windows下的BT服务器搭建方案

    BT下载可以说是目前网络上最流行的P2P文件共享方式了.BT服务器相比于FTP服务器有许多优势,其中最重要的一点就是BT服务器不受服务器带宽和连接到服务器用户数量的限制,能够提供高速的下载服务.今天, ...

  6. Retrofit 2.0 throwing @Field parameters can only be used with form encoding

    最近在学习Retrofit2.0想用Retrofit + Dagger2 + RxJava + ButterKnife一起使用重构项目 一方面自己的demo随着业务逻辑的增多 显得非常的乱 另一方面代 ...

  7. WinForm打印之页边距

    1.启用页边距: 默认情况下PrintDocument是不理会页边距的(MS再次让人无语...),这也是为什么有人说明明设了页边距在打印预览里却没有效果的原因. 解决办法是设置PrintDocumen ...

  8. HDU 4799 LIKE vs CANDLE 树形dp

    题意:有n个人,他们的关系,形成一棵有根树(0是树根,代表管理员),每个人有一个价值 现在有一条微博,每个人要么点赞,要么送一个蜡烛 初始一些人利用bug反转了某些人的操作(赞变蜡烛 或者 蜡烛变成赞 ...

  9. [codevs4247]奇特的生物

    题目描述 Description 科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限.已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具 ...

  10. spoj 8222 Substrings(后缀自动机+DP)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28005 [题意] 给一个字符串S,令F(x)表示S的所有长度为 ...