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

最新文章

  1. 利用SQLServer数据库发送邮件
  2. 浅谈objective—C管理内存
  3. SpringMVC+Spring+Hibernate+Maven+mysql整合
  4. android112 jni 把java的字符串转换成c的字符串,数组处理
  5. javascript中涉及到汉字的比较
  6. Drawer_layout 关闭滑动视图
  7. iphone开发笔记目录
  8. Javascript高级编程学习笔记(61)—— 事件(5)UI事件
  9. mysql 删除用户
  10. 安装Oracle Database 11g 找不到文件“WFMLRSVCApp.ear” .
  11. python 错误: UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe4 in position 0: ordinal not in range(128)
  12. IDFA
  13. Guice与Spring框架的区别
  14. HDU1530 Maximum Clique dp
  15. String 、 StringBuffer 和 StringBuilder
  16. SVG报错error on line 39 at column 26: Namespace prefix xlink for href on script is not defined
  17. Java之开发工具(1) - Eclipse 如何设置注释的模板
  18. 【基础练习】【区间DP】codevs2102 石子归并2(环形)题解
  19. BZOJ5251:[九省联考2018]劈配——题解
  20. 关于Spring管理的类如何创建对象

热门文章

  1. 004_Nginx 499错误的原因及解决方法
  2. 队列queue 代码
  3. Oracle基本命令大全
  4. react之shouldComponentUpdate简单定制数据更新
  5. windows10+mysql8.0.11zip安装
  6. php中的接口interface
  7. hdu1024线性dp
  8. ThreadLocal详解,处理成员变量线程不安全的情况
  9. [转] 深入理解React 组件状态(State)
  10. eclipse错误GC overhead limit exceeded