自定义一个QThreadPool,N个线程QRunnable,线程和Widget通过QMetaObject::invokeMethod交互。

QRunnable非继承自QObject,所以不可以用信号和槽的方式和Widget主界面交互,为了和Widget主界面交互,可以用QMetaObject::invokeMethod进行交互。

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

QMyRunnable.h

#ifndef QMYRUNNABLE_H
#define QMYRUNNABLE_H
#include <QTest>
#include <QRunnable> class QMyRunnable : public QRunnable
{
public:
QMyRunnable(QObject* obj); protected:
void run();
private:
QObject* obj;
};

QMyRunnable.cpp

#include "qmyrunnable.h"
#include "widget.h"
QMyRunnable::QMyRunnable(QObject* obj) : obj(obj)
{
}
void QMyRunnable::run()
{
  QString str = QString("%1+%2=%3").arg(1).arg(1).arg(1+1);
  QMetaObject::invokeMethod(obj,"Update_Result",Q_ARG(QString,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、QThreadPool线程池的使用,线程和Widget通过QMetaObject::invokeMethod交互。的更多相关文章

  1. Java多线程系列--“JUC线程池”01之 线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构 ...

  2. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

  3. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  4. Java多线程系列--“JUC线程池”04之 线程池原理(三)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...

  5. Java多线程系列--“JUC线程池”05之 线程池原理(四)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  6. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  7. 通过设置线程池的最小线程数来提高task的效率,SetMinThreads。

    http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...

  8. 内存池、进程池、线程池介绍及线程池C++实现

    本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...

  9. Executors提供的四种线程池和自定义线程池

    JAVA并发编程——EXECUTORS 线程池的思想是一种对象池的思想,开放一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完毕,对象 ...

随机推荐

  1. Gnucash数据库结构

  2. CSS规范 - 命名规则--(来自网易)

    使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用. NEC特殊字符:"-"连字符 "-"在本规范中并不表示连 ...

  3. 一个中国地图的SVG,可以带参数

    <script src="http://files.cnblogs.com/files/LoveOrHate/jquery.min.js"></script> ...

  4. html5 canvas arcTo()

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Linux - 用户操作

    常用命令 users # 显示所有的登录用户 groups # 列出当前用户和他所属的组 who -q # 显示所有的登录用户 groupadd # 添加组 useradd user # 建立用户 p ...

  6. Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  7. Nginx安装方式探究

    Ubuntu 16.04(阿里云ECS),Nginx 1.10.3 (Ubuntu) 本文探究两种安装方式: 1.源码安装(手动) 2.APT安装(自动) 源码安装(手动) 步骤简介: 下载.解压.. ...

  8. C# 每月第一天和最后一天

    //每月第一天 - DateTime.Now.Day); //每月最后一天 var endTime=DateTime.Now.AddDays(1 - DateTime.Now.Day).AddMont ...

  9. [原创]Sql2008 使用TVP批量插入数据

    TVP(全称 :Table-Valued Parameter) 叫做表值参数(Table-Valued Parameter)是SQL2008的一个新特性.顾名思义,表值参数表示你可以把一个表类型作为参 ...

  10. ubuntu eclipse 找不到jre文件

    一. 把jdk下的jre文件copy到eclipse安装目录 二. 打开eclipse 重新设计library和工作空间