欢迎光临散文网 会员登陆 & 注册

Qt 中多线程的使用方法1--重写 run() 函数

2023-06-01 23:52 作者:钢厂小霸王_X  | 我要投稿

在进行开发桌面应用程序的时候,有些情况下应用程序需要处理比较复杂的逻辑,如果只有一个线程去处理这些逻辑,就会导致窗口界面卡顿,无法响应用户操作。为了解决这个问题,可以采用多线程的方式来处理,其中一个线程负责处理窗口事件,而其他线程则负责处理复杂的逻辑运算。多个线程各司其职,既能提高用户体验,又可以优化程序执行效率。

在 qt 中使用了多线程,有些事项是需要额外注意的:

  • 默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新

  • 子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理

  • 主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制。

线程类 QThread

Qt 中提供了一个线程类,通过这个类就可以创建子线程了,Qt 中一共提供了两种创建子线程的方式。

常用共用成员函数:

信号槽:

 静态函数:

任务处理函数:

在使用 Qt 进行多线程编程时,如果想让创建的子线程执行某个任务,需要创建一个新的类,让其继承自 QThread,然后重写 run() 函数,并在函数体中编写对应的任务处理流程。值得注意的是,这个函数是一个受保护的成员函数,不能够在类的外部直接调用,而是需要通过当前线程对象调用 start() 槽函数来启动子线程。启动后,子线程一旦开始运行,run() 函数也就顺理成章地被调用了。


使用方式 :

1.  需要创建一个线程类的子类,让其继承 QT 中的线程类 QThread,比如:

2.  重写父类的 run () 方法,在该函数内部编写子线程要处理的具体流程

3.  在主线程中创建子线程对象,new几个都可以,多个功能一样的线程可以用一个指针数组存储地址

4.  启动子线程,调用 start () 方法

  • 不能在类的外部调用 run () 方法启动子线程,在外部调用 start () 相当于让 run () 开始运行。

  • 当子线程别创建出来之后,父子线程之间的通信可以通过信号槽的方式

  • 在 Qt 中在子线程中不要操作程序中的窗口类型对象,不允许,如果操作了程序就挂了

  • 只有主线程才能操作程序中的窗口对象,默认的线程就是主线程,自己创建的就是子线程

示例代码:

在下面的窗口中,点击按钮开始在两个子线程中进行不同的排序,在主线程里面通过信号槽机制处理子线程返回的结果,同时显示在UI界面。

最终结果

同时我们可以看到不同线程的地址和运行速度也是不一样的。

mytread.h

mytread.cpp:

widget.cpp:

这种在程序中添加子线程的方式是非常简单的,但是也有弊端,假设要在一个子线程中处理多个任务,所有的处理逻辑都需要写到run()函数中,这样该函数中的处理逻辑就会变得非常混乱,不太容易维护。同时重写的run()里面不能传入参数,需要我们通过信号的方式来实现。后面还会介绍一个moveToThread()的方法,这个方法更加灵活,用的也较多。


Qt 中多线程的使用方法1--重写 run() 函数的评论 (共 条)

分享到微博请遵守国家法律