当前位置: 首页 > backend >正文

Qt 多线程的几种实现方式

Qt多线程的实现方式有:

1. 继承QThread类,重写run()方法

2. 使用moveToThread将一个继承QObject的子类移至线程,内部槽函数均在线程中执行

3. 使用QThreadPool,搭配QRunnable(线程池)

4. 使用QtConcurrent(线程池)

为什么要用线程池?

创建和销毁线程需要和OS交互,少量线程影响不大,但是线程数量太大,势必会影响性能,使用线程池可以减少这种开销。

一、继承QThread类,重写run()方法

缺点:

  1. 每次新建一个线程都需要继承QThread,实现一个新类,使用不太方便。
  2. 要自己进行资源管理,线程释放和删除。并且频繁的创建和释放会带来比较大的内存开销。
适用场景:QThread适用于那些常驻内存的任务。

 1 //mythread.h2 #ifndef MYTHREAD_H3 #define MYTHREAD_H4 5 #include <QThread>6 7 class MyThread : public QThread8 {9 public:
10     MyThread();
11     void stop();
12 
13 protected:
14     void run();
15 
16 private:
17     volatile bool stopped;
18 };
19 
20 #endif // MYTHREAD_H
 1 //mythread.cpp2 #include "mythread.h"3 #include <QDebug>4 #include <QString>5 6 MyThread::MyThread()7 {8     stopped = false;9 }
10 
11 
12 
13 void MyThread::stop()
14 {
15     stopped = true;
16 }
17 
18 
19 
20 void MyThread::run()
21 {
22     qreal i = 0;
23 
24     while( !stopped )
25     {
26         qDebug() << QString("in MyThread: %1").arg(i);
27         sleep(1);
28         i++;
29     }
30     stopped = false;
31 }
 1 //widget.h2 #ifndef WIDGET_H3 #define WIDGET_H4 5 #include <QWidget>6 #include "mythread.h"7 8 9 QT_BEGIN_NAMESPACE
10 namespace Ui { class Widget; }
11 QT_END_NAMESPACE
12 
13 class Widget : public QWidget
14 {
15     Q_OBJECT
16 
17 public:
18     Widget(QWidget *parent = nullptr);
19     ~Widget();
20 
21 private slots:
22     void on_startBut_clicked();
23 
24     void on_stopBut_clicked();
25 
26 private:
27     Ui::Widget *ui;
28     MyThread thread;
29 };
30 #endif // WIDGET_H
 1 //widget.cpp2 3 #include "widget.h"4 #include "ui_widget.h"5 6 Widget::Widget(QWidget *parent)7     : QWidget(parent)8     , ui(new Ui::Widget)9 {
10     ui->setupUi(this);
11     ui->startBut->setEnabled(true);
12     ui->stopBut->setEnabled(false);
13 }
14 
15 Wid
http://www.xdnf.cn/news/11426.html

相关文章:

  • Linux系统三步安装QQ
  • C/C++网络编程
  • JSTL-核心标签库
  • 动态域名内网穿透(永久免费)
  • 设计模式七大原则-迪米特法原则
  • 安全小课堂丨什么是暴力破解?如何防止暴力破解
  • 谷歌浏览器、Yandex浏览器使用体验分享
  • 光流法(optical flow)简介
  • 13800138000来电?手机管家:小心诈骗
  • Windows 10 离线安装 .NET Framework 3.5 的方法和技巧
  • WISP模式
  • waterdrop介绍
  • CreateThread()函数及_beginthreadex()函数
  • C++ ofstream和ifstream详细用法
  • 使用Latex制作分享,演讲,Presentation用的Slides,PPT——Beamer教程
  • .htaccess语法讲解
  • [Linux系列]Chrony时间同步服务器
  • 下载了鲁大师,打开goolgle浏览器弹出360导航页
  • Web前端开发【新手入门指南】
  • JFreeChart 使用介绍
  • maven 环境变量的配置
  • 使用Collections.shuffle打乱集合顺序
  • 曼彻斯特编码
  • build-essential软件包简介
  • 24 | Boost:你需要的“瑞士军刀”
  • JQuery选择器及其样式操作、筛选方法以及链式编程
  • 彩虹表(rainbow table)
  • 如何用GlobalMapper下载高清卫星影像?
  • Apache CXF 架构指南
  • matlab使用教程(73)—指定绘图颜色