Qt 之 Threads 和 QObjects

本文详细介绍了Qt中的线程和QObjects的使用,包括QObject的可重入性、每个线程的事件循环、从其他线程访问QObject子类以及跨线程的信号和槽。强调了QThread的事件循环、线程安全问题以及信号槽的四种连接类型,特别指出Direct Connection在不同线程间的不安全性,并提供了Mandelbrot和Blocking Fortune Client两个示例来说明实践中的应用。

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

QThread继承自QObject,它发射信号(signals)以表明线程执行开始或结束,并提供了一些槽函数(slots)。

更有趣的是,QObjects可以在多线程中使用,发射信号以在其它线程中调用槽函数,并且向“存活”于其它线程中的对象发送事件(post events)。这是可能的,因为每一个线程都拥有它自身的事件循环(event loop)。

QObject可重入性

QObject是可重入的。它的大多数非GUI子类,例如:QTimer、QTcpSocket、QUdpSocket和QProcess,也都是可重入的,这使得在多线程中同时使用这些类成为可能。**注意:**这些类被设计成在单一线程中创建和使用的,在一个线程中创建一个对象而在另一个线程中调用该对象的函数,不保证能行得通。需要注意有三个约束:

  • 一个QObject类型的孩子必须总是被创建在它的父亲所被创建的线程中。这意味着,除了别的以外,永远不要把QThread对象(this)作为该线程中创建的一个对象的父亲(因为QThread对象自身被创建在另外一个线程中)。

  • 事件驱动的对象可能只能被用在一个单线程中。特别是,这适用于计时器机制(timer mechanism)和网络模块。例如:你不能在不属于这个对象的线程中启动一个定时器或连接一个socket,必须保证在删除QThrea

Daemon threads即守护线程,是Java中低优先级的线程,其作用是为User Thread(用户线程)提供服务。由于其低优先级且仅服务于用户线程,当所有的用户线程都结束之后,JVM会自动退出,不管是否还有守护线程在运行中。可通过`thread.setDaemon(true)`将线程设置为守护线程,不过该设置必须在`thread.start()`之前进行,否则会抛出一个`IllegalThreadStateException`异常,不能把正在运行的常规线程设置为守护线程。常见的守护线程有后台记录操作日志、监控内存、垃圾回收等[^1][^3][^4]。 而关于“live threads”,提供的引用内容中未提及相关定义。在Java中,“live threads”通常指的是存活线程,即当前正在运行或者处于可运行状态(等待CPU调度)的线程。 ```java // 示例代码展示守护线程的设置 public class TestDaemon { public static void main(String[] args) { God god = new God(); You you = new You(); Thread thread = new Thread(god); thread.setDaemon(true); // 将上帝线程设置为守护线程 thread.start(); // 启动守护线程 Thread life = new Thread(you); life.start(); // 普通线程启动 } } class You implements Runnable { @Override public void run() { for (int i = 0; i < 365; i++) { System.out.println("开心的活着"); } System.out.println("=========goodbye! world!========"); } } class God implements Runnable { @Override public void run() { while (true) { System.out.println("上帝保护着你!"); } } } ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值