Qt中线程是一个非常难的问题。这里记录下我的理解。
Qt中线程解决问题:由于复杂的操作(复杂计算、复杂绘图等操作)使得整个应用程序变得卡顿时。
这个时候就可以使用线程,将复杂的操作放到新开的线程中完成,完成后emit一个信号给主线程表明其操作完成。
两种调用线程处理复杂操作的思路:
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
当控制权回到接受者所在线程的事件循环式,槽函数被调用。
槽函数在接收者所在线程执行。
简单来说:槽函数所在线程和接受者一样。
还是有点晕晕的,对于小白的我,,我还是使用默认参数把。。