Qt学习记录---(6)线程(QThread)和connect的第五个参数

Qt中线程是一个非常难的问题。这里记录下我的理解。
Qt中线程解决问题:由于复杂的操作(复杂计算、复杂绘图等操作)使得整个应用程序变得卡顿时。
这个时候就可以使用线程,将复杂的操作放到新开的线程中完成,完成后emit一个信号给主线程表明其操作完成。

注意: 1.QThread其实是管理线程的工具,它是属于主线程的,直接调用QThread的槽函数(不是run函数),也是在主线程中调用。需要使用到moveToThread函数,才能使其槽函数在次线程中运行。 2.线程处理函数中,不允许操作图形界面,否则应用程序会卡死

两种调用线程处理复杂操作的思路:

1.直接将复杂操作直接放到run函数

run函数对于QThread就相当于main函数。这种方法的操作步骤:
(1)创建一个QThread的类
在这里插入图片描述
(2)将复杂操作放如QThread的run函数中,执行完emit一个信号告知主线程任务完成
在这里插入图片描述
(3)主线程中创建QThread的对象,并且指定父对象为主窗口。
在这里插入图片描述
(4)开启线程,就会自动在次线程中执行run函数
在这里插入图片描述
(5)当窗口关闭时,需要回收线程
在这里插入图片描述
在这里插入图片描述
感觉这种线程对于不是太好处理多任务。(全部操作都要放到run函数中,十分麻烦)

2.创建QObject类,将其对象move到QThread中

这种方法不用重载run函数,无视它。但是稍微有一点小绕,但是如果掌握到了,感觉操作线程会十分的方便。
(1)创建一个QObject类,
在这里插入图片描述
(2)将复杂的函数写为QObject的槽函数,可以多个任务对应多个槽函数。我这里的任务是画一幅图
在这里插入图片描述
(3)
a.主线程中创建QThread对象,并且指定对象为父对象,并且创建QObject 对象,不能指定父对象,
b.然后用moveToThread将QObject对象move到QThread对象
c.开启线程
在这里插入图片描述
在这里插入图片描述

(4)通过signal-slot的方式来执行次线程中的任务,我这里是通过定时器的timeout信号来调用次线程中的画图任务。
在这里插入图片描述
(5)当窗口关闭时,需要回收线程QThread对象和线程任务QObject 对象
在这里插入图片描述
在这里插入图片描述
这种方法感觉很好用,可以在一个次线程中创建多个任务,但是要注意只能使用signal-slot来调用。

3.connect的第五个参数

connect的第五个参数与多线程有关系,,这里做做笔记。第五个参数最常见的有三个值:Auto Connection(自动连接)、Direct Connection(直接连接)、Queued Connection(队列连接)

(1)Auto Connection
如果发送者和接收者处于同一线程,则等同于直接连接。
如果发送者和接受者位于不同线程,则等同于队列连接。

(2)Direct Connection
当信号发射时,槽函数将直接被调用。
无论槽函数所属对象在哪个线程,槽函数都在发射者所在线程执行。
简单来说:槽函数所在线程和发送者一样。

(3)Queued Connection
当控制权回到接受者所在线程的事件循环式,槽函数被调用。
槽函数在接收者所在线程执行。
简单来说:槽函数所在线程和接受者一样。

还是有点晕晕的,对于小白的我,,我还是使用默认参数把。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用以下方式在线程之间连接信号和槽: 1. 使用QObject::connect()函数连接信号和槽。例如: ``` // 在主线程中创建一个QObject对象 QObject* obj = new QObject; // 在子线程中创建一个QThread对象 QThread* thread = new QThread; // 将QObject对象移动到子线程中 obj->moveToThread(thread); // 连接信号和槽 QObject::connect(obj, SIGNAL(mySignal()), SLOT(mySlot()), Qt::QueuedConnection); // 启动线程 thread->start(); ``` 在这个例子中,QObject对象和QThread对象分别在主线程和子线程中创建。使用QObject::moveToThread()函数将QObject对象移动到子线程中,然后使用QObject::connect()函数连接信号和槽。注意,这里使用Qt::QueuedConnection参数确保信号和槽的执行发生在接收者所在的线程中。 2. 使用Qt::AutoConnection连接机制。例如: ``` // 在主线程中创建一个QObject对象 QObject* obj = new QObject; // 在子线程中创建一个QThread对象 QThread* thread = new QThread; // 将QObject对象移动到子线程中 obj->moveToThread(thread); // 连接信号和槽 QObject::connect(obj, &QObject::destroyed, thread, &QThread::quit, Qt::AutoConnection); // 启动线程 thread->start(); ``` 在这个例子中,使用Qt::AutoConnection连接机制连接信号和槽。这种连接机制会自动选择Qt::DirectConnection或Qt::QueuedConnection,具体取决于信号和槽所在的对象是否在同一线程中。在这里,由于QObject对象已经被移动到子线程中,因此使用Qt::QueuedConnection连接机制确保了信号和槽的执行发生在子线程中。 需要注意的是,在连接信号和槽时,不同的连接机制可能会产生不同的效果。如果不确定应该使用哪种连接机制,可以查看Qt文档中关于连接机制的介绍,或者尝试不同的连接机制并观察它们的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值