106 基于moveToThread的多线程编程

106.1 工作对象

QThread类的虚函数run在基类中的实现,就是调用exec函数处理事件循环。如果将某个对象移入该类所表示的子线程,且为该对象设置了信号——槽的连接,一旦信号触发,相应的槽函数将在子线程中被执行。

调用工作对象的moveToThread方法,将其移入子线程,需要注意以下几点:

通过QObject类的moveToThread方法实现多线程编程的一般步骤如下:

  1. 从QObject类派生出表示工作对象的子类,并在其中定义期望在子线程中执行的槽函数;

  2. 实例化工作对象,并将某个信号与工作对象的槽函数建立连接;

  3. 实例化线程对象,通过工作对象的moveToThread方法,将其移入线程;

  4. 通过线程对象的start方法启动线程;

  5. 这时一旦信号触发,工作对象中与之相连的槽函数将在线程对象所表示的子线程中被执行。

106.2 案例

106.2.1 创建项目

通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为MoveTo的项目。

106.2.2 设计界面

C:\Users\Minwei\Projects\Qt\MoveTo\movetodialog.ui:

106.2.3 实现功能

106.2.3.1 工作对象

C:\Users\Minwei\Projects\Qt\MoveTo\worker.h:

C:\Users\Minwei\Projects\Qt\MoveTo\worker.cpp:

106.2.3.2 主窗口

C:\Users\Minwei\Projects\Qt\MoveTo\movetodialog.h:

C:\Users\Minwei\Projects\Qt\MoveTo\movetodialog.cpp:

106.2.4 测试验证

运行效果如图所示: