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

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

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

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

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

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

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

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

3.connect的第五个参数

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

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

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

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

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

相关文章:

  • 2022-12-23
  • 2021-12-13
  • 2021-09-09
  • 2022-12-23
  • 2021-07-04
  • 2021-10-18
  • 2022-12-23
猜你喜欢
  • 2022-02-24
  • 2021-10-07
  • 2021-05-30
  • 2021-05-20
  • 2021-05-13
  • 2022-12-23
  • 2022-02-09
相关资源
相似解决方案