QThreadPool&QRunnable&類函數的使用


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();
  QString absolute(int a);
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"

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;
}
QString Widget::absolute(int a)  
{
  return QString("abs(%1)=%2").arg(a).arg(abs(a));
}
void Widget::Update_Result(QString str)
{
ui->lineEdit_1->setText(str);
}
void Widget::on_emit_Btn_clicked()
{
  MyThreadPool.start(new QMyRunnable(&Widget::absolute,1,this));//將函數指針和參數傳遞進去(函數名即可以理解為函數指針)
}

QMyRunnable.h

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

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

protected:
void run();

signals:
  void Update_Result(QString);
private:
  int _param;
  QObject* _obj;
  QString (Widget::*_func)(int);//函數指針
};

QMyRunnable.cpp

#include "qmyrunnable.h"
#include "widget.h"
QMyRunnable::QMyRunnable(QString (Widget::*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 = _obj->*_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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM