zoukankan      html  css  js  c++  java
  • QThreadPool线程池的开发使用

    QThreadPool+QRunnable线程池与QThread线程两种方式使用的场景不同,QThreadPool+QRunnable线程池主要用于那种不需要一直运行的任务,而QThread主要用于长期运行的任务。

    为了使QRunnable能够灵活地执行各种任务,可以对QRunnable进行封装,在构造函数中加入函数指针,QRunnable只负责执行该函数,而具体什么操作由传入的函数决定。

    定义一个类QMyRunnable,该类首先继承自QObject,再继承自QRunnable。

    1、创建一个Widget工程,并在Widget类下定义一个QThreadPool的私有变量MyThreadPool;

    2、在Widget的构造函数中设置MyThreadPool的属性,如:setMaxThreadCount(1)等等。

    3、新建一个私有槽函数 void showinfo(QString str);

    4、在Widget.cpp实现该函数,将str信息显示到界面的QLineEdit编辑框。

    5、在Widget的ui界面添加一个按钮,用于MyThreadPool创建一个任务,添加一个QLineEdit编辑框,用于显示str。

    6、为了和Widget交互,需要对QRunnable进行自定义封装,在构造函数中将Widget指针传递进去,并将函数传递进去。

    代码如下:

    Widget.h

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <math.h>
    #include <QWidget>
    #include <QLineEdit>
    #include <QThreadPool>
    //////////////////////////////////////////////////////
    namespace Ui {
    class Widget;
    }
    class Widget : public QWidget {
    Q_OBJECT
    public:
    Widget(QWidget *parent = 0);
    ~Widget();
    private slots:
    void on_emit_Btn_clicked();
    void Update_Result(QString);

    private:
    Ui::Widget *ui;
    QThreadPool MyThreadPool;
    };

    Widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include "qmyrunnable.h"

    //自定义一个函数
    QString absolute(int a)  {return QString("abs(%1)=%2").arg(a).arg(abs(a));}
    Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
    {
    ui->setupUi(this);
    MyThreadPool.setMaxThreadCount(1);
    MyThreadPool.setParent(this);
    }
    Widget::~Widget()
    {
    MyThreadPool.waitForDone();
    delete ui;
    }

    void Widget::Update_Result(QString str)
    {
    ui->lineEdit_1->setText(str);
    }
    void Widget::on_emit_Btn_clicked()
    {
      MyThreadPool.start(new QMyRunnable(absolute,1,this));//将函数指针和参数传递进去(函数名即可以理解为函数指针)
    }

    QMyRunnable.h

    #ifndef QMYRUNNABLE_H
    #define QMYRUNNABLE_H
    #include <QTest>
    #include <QRunnable>

    class QMyRunnable : public QObject,public QRunnable
    {
    public:
    QMyRunnable(QString (*func)(int),int,QObject* obj);

    protected:
    void run();

    signals:
      void Update_Result(QString);
    private:
      int param;
      QString (*func)(int);//函数指针
    QObject* obj;
    };

    QMyRunnable.cpp

    #include "qmyrunnable.h"
    #include "widget.h"
    QMyRunnable::QMyRunnable(QString (*func)(int),int param,QObject* obj) : func(func),param(param),obj(obj)
    {
      Widget* pWidget = (Widget*)obj;
      connect(this,SIGNAL(Update_Result(QString)),pWidget,SLOT(Update_Result(QString)));
    }
    void QMyRunnable::run()
    {
      QString str = func(param);
      emit(Update_Result(str));
    QTest::qWait(100);
    }

    main.cpp

    #include <QtGui/QApplication>
    #include "widget.h"

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
    }
  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/zhangnianyong/p/8932779.html
Copyright © 2011-2022 走看看