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();
}