moveToThread
该函数属于QObject,因此任何继承于QObject的对象都可以使用该函数。
使用该函数可以减少主线程界面刷新的压力
官方解释:
1:
更改此对象及其子对象的线程相关性。如果对象有父对象,则无法移动该对象。事件处理将在targetThread中继续。
解释:每一个QObject对象都有事件循环,默认子类事件是可以传递给父类的,界面(或者说是每一个部件)更新,调用的是就重绘事件(paint),正常而言我们只有一个主线程(一个事件循环),也就是main()函数中启动的QApplication::exec()。此时界面上的所有控件的鼠标、键盘相应事件,重绘事件(刷新界面)等都是在主线程中进行。
如果我们创建了一个新的QThread线程,之后将一个没有父对象的QObject调用moveToThread函数移动到这个线程中的话,那个这个QObject的事件循环就会运行在这个子线程中,也就是这个控件的刷新,各种事件响应函数都会在这个子线程中运行,包括这个空间发射的信号也是从子线程中发射的。
2:
要将对象移动到主线程,请使用QApplication::instance()来检索指向当前应用程序的指针,然后使用QAApplication::thread()来获取应用程序所在的线程。例如:myObject->moveToThread(QApplication::instance()->thread());
解释:一种方式,将已经移动到子线程中的QObject对象重新移动回主线程
3:
如果targetThread为nullptr,则此对象及其子对象的所有事件处理都将停止,因为它们不再与任何线程关联。
解释:如果我们在移动QObject对象时,targetThread(nullptr)传入了一个空的对象,则这个QObject将没有线程来负责他的事假循环,将不会有任何响应
4:
请注意,对象的所有活动计时器都将重置。计时器首先在当前线程中停止,然后在targetThread中重新启动(间隔相同)。因此,在线程之间不断移动对象可以无限期地推迟计时器事件。
QEvent::ThreadChange事件在线程相关性更改之前发送到此对象。您可以处理此事件以执行任何特殊过程
解释:QTimer有关的解释