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

QThreadPool线程池的开发使用的更多相关文章

  1. Qt多线程-QThreadPool线程池与QRunnable

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable     本文地址:https:/ ...

  2. 66.QT-线程并发、QTcpServer并发、QThreadPool线程池

    1.线程并发一个程序内部能拥有多个线程并行执行.一个线程的执行可以被认为是一个CPU在执行该程序.当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序.总之,多线程即可以这么理解:多线程是处理 ...

  3. 1、QThreadPool线程池的使用,线程和Widget通过QMetaObject::invokeMethod交互。

    自定义一个QThreadPool,N个线程QRunnable,线程和Widget通过QMetaObject::invokeMethod交互. QRunnable非继承自QObject,所以不可以用信号 ...

  4. QThreadPool线程池的使用,线程与Widget通过信号与槽的方式通信。

    因为QRunnable类并非继承自QObject,不能使用信号和槽,为了能够使用信号与槽和Widget通信,需要对QRunnable进行封装. 定义一个类QMyRunnable,该类首先继承自QObj ...

  5. Delphi ThreadPool 线程池(Delphi2009以上版本适用)

    http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...

  6. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

  7. 线程池 队列 synchronized

    线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...

  8. java线程池01-ThreadPoolExecutor构造方法参数的使用规则

    为了更好的使用多线程,JDK提供了线程池供开发人员使用,目的在于减少线程的创建和销毁次数,以此达到线程的重复利用. 其中ThreadPoolExecutor是线程池中最核心的一个类,我们先简单看一下这 ...

  9. 从线程池到synchronized关键字详解

    线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...

随机推荐

  1. SQLSTATE[42000]

    SQLSTATE[42000]: Syntax error or access violation: 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT() ...

  2. 编写安全的API接口

    HTTPS接口参数加密签名设计思路 数名 类型 必选 描述 _appid string 是 调用方身份ID,接口提供方用此来识别调不同的调用者,该参数是API基本规范的一部分,请详见API公共规范. ...

  3. Sortable.js参数

    所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象ui.pos ...

  4. [转]GCC系列: __attribute__((visibility("")))

    在 objc-api.h 里面有很多关于__attribute__ 的定义. 例如 #if !defined(OBJC_VISIBLE) # if TARGET_OS_WIN32 # if defin ...

  5. CSS text系列

    text-shadow 语法规则: h-shadow(必需,水平阴影的位置,可负): v-shadow(必需,垂直阴影的位置,可负): blur(可选,模糊距离): color(可选,阴影的颜色). ...

  6. keepalived启动不成功,状态一直是inactive(dead) 的解决办法以及keepalived高版本没有rc.d目录,虚拟VIP无法访问问题

    安装配置教程我就不说了,网上很多,这里只给出我遇到的两个坑: 1 rc.d目录 ,kp在1.4版本之后rc.d要去解压之后的源码包里去找,make之后的目录里面没有了,我使用的是2.0.13最新版本, ...

  7. js 替换任意字符串中间几位为*星号

    <script> var str='河南纳智企业管理咨询有限公司'; a=str.substr(0,2)+'***'+str.substr(5,str.split('').length); ...

  8. GET和POST两种基本请求方法的区别(转载)

    get与post请求的区别: 通常回答: GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET请求会被浏览器主动cache ...

  9. Zookeeper命令行zkCli.sh&zkServer.sh的使用(四)

    上篇博文,我们成功的安装和启动了zookeeper服务器,zookeeper还提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh).还 ...

  10. tomcat启动不成功(点击startup.bat闪退)的解决办法

    今天遇到tomcat手动启动不成功,但是再eclipse里面是可以启动成功的.我一直开始以为是端口被占用了,最后才发现是这么一回事.首先说下我的tomcat是安装版的.免安装的tomcat双击star ...