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
当控制权回到接受者所在线程的事件循环式,槽函数被调用。
槽函数在接收者所在线程执行。
简单来说:槽函数所在线程和接受者一样。