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. 【整理】Git相关资料

    http://book.51cto.com/art/201107/278731.htm http://book.51cto.com/art/201107/278828.htm  

  2. 用Canvas做动画

    之前看过不少HTML5动画的书,讲解的是如何去做,对于其中的数学原理讲解的不详细,常有困惑.最近看的<HTML5+JavaScript 动画基础>这个是译本,Keith Peters曾写过 ...

  3. Oracle 查看锁表进程_杀掉锁表进程 [转]

    查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...

  4. HTML5 CSS Reset

    最近在学习HTML和CSS,发现一个不错的模板,放于此处. /* html5doctor.com Reset Stylesheet v1.6.1 Last Updated: 2010-09-17 Au ...

  5. jdk1.8源码Synchronized及其实现原理

    一.Synchronized的基本使用 关于Synchronized在JVM的原理(偏向锁,轻量级锁,重量级锁)可以参考 :  http://www.cnblogs.com/dennyzhangdd/ ...

  6. python版本管理工具pyenv和包管理工具pipenv

    一.pyenv版本管理工具 pyenv是一个python版本管理工具,可以实现轻松切换多个python版本 它可根据每个用户更改全局python版本,也可以为每个项目指定python版本,还可以管理v ...

  7. QTP设置共享对象库

    第一步:把需要加到共享对象库中的各个用例脚本的对象库,分别导出成.tsr文件. 操作方法:先用QTP打开已经录制完毕的脚本后,选择Resources-->Object Repository.然后 ...

  8. MongoDB学习笔记-1

    mongod --dbpath D:\MogonDB3.4.10\db //开启数据库,无端口号mongod --dbpath D:\MogonDB3.4.10\db --port=10086 //开 ...

  9. Ubuntu 12.04 下 Sublime Text 3 Build 3047 破解

    1. $sudo vim /opt/sublime_text/sublime_text 2. 将文件转成十六进制形式.在 vim 中输入: :%!xxd 3. 查找数字串 “4333 3342 303 ...

  10. android4.0后无法向Servlet发送请求解决办法

    从4.0开始,强制性地规定网络堵塞任务都不能放在ui线程,不然直接报错. 个办法,在oncreate下面加入 StrictMode.setThreadPolicy(new StrictMode.Thr ...