QT 多线程(QThread)里调用线程池(QThreadPool )与主界面进行通讯
来源:互联网 发布:淘宝发错货赔偿规则 编辑:程序博客网 时间:2024/05/22 15:48
QT 多线程(QThread)里调用线程池(QThreadPool )与主界面进行通讯
在最近的一个项目中,遇到了一个问题,就是主界面调用一个线程,然后再线程中开启一个线程池进行数据生成,线程池调用的线程对象必须继承自QRunable类,这个类有个缺点,就是因为它无法继承QObject,所以不能向外面发送信号,但是我们需要在主界面显示它输出的信息。怎么办呢?
- 编写一个QRunable子类
- 编写一个QThread子类
- 调用QThread子类
编写一个QRunable子类
编写一个QRunable子类MyRunable
MyRunable.h代码,如下:
#ifndef MYRUNNABLE_H#define MYRUNNABLE_H#include <QRunnable>#include <QMetaObject>class MyRunnable : public QRunnable{public: MyRunnable(QObject *parent = 0); ~MyRunnable(); void run(); void setID(const int &id); //向外传送消息 void requestMsg(const QString &msg);private: //父对象 QObject *mParent; int runnableID;};#endif // MYRUNNABLE_H
MyRunable.cpp代码,如下:
#include "myrunnable.h"#include <QDebug>#include <QThread>MyRunnable::MyRunnable(QObject *parent) : QRunnable(){ mParent = parent;}MyRunnable::~MyRunnable(){ runnableID = 0;}void MyRunnable::setID(const int &id){ runnableID = id;}void MyRunnable::requestMsg(const QString &msg){ QMetaObject::invokeMethod(mParent, "requestMsg", Qt::QueuedConnection, Q_ARG(QString, msg));}void MyRunnable::run(){ for(int i = 0;i < 10;i++) { requestMsg(QString("this is a MyRunnable %1").arg(runnableID)); QThread::sleep(1); }}
编写一个QThread子类
编写一个QThread子类MyThread
MyThread.h代码,如下:
#ifndef MYTHREAD_H#define MYTHREAD_H#include <QThread>class MyThread : public QThread{ Q_OBJECTpublic: explicit MyThread(QObject *parent = 0);protected: void run();signals: void requestMsg(const QString &msg);public slots:};#endif // MYTHREAD_H
MyThread.cpp代码,如下:
#include "mythread.h"#include <QThreadPool>#include "myrunnable.h"#include <QDebug>MyThread::MyThread(QObject *parent) : QThread(parent){}void MyThread::run(){ qDebug() << "MyThread"; QThreadPool myPool; myPool.setMaxThreadCount(4); for(int i = 0;i < 4;i++) { MyRunnable *subThread = new MyRunnable(this); subThread->setID(i); myPool.start(subThread); } myPool.waitForDone();}
调用QThread子类
在MainWindow中调用MyThread并关联信号槽
MainWindow .h代码,如下:
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "mythread.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow();private slots: void showMsg(const QString &msg);private: Ui::MainWindow *ui; MyThread myThread;};#endif // MAINWINDOW_H
MainWindow .cpp代码,如下:
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>#include <QDateTime>#include <QThreadPool>#include <myrunnable.h>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ connect(&myThread,SIGNAL(requestMsg(const QString&)),this,SLOT(showMsg(const QString&))); myThread.start();}void MainWindow::showMsg(const QString &msg){ qDebug()<< msg;}
运行结果
MyThread"this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3""this is a MyRunnable 0""this is a MyRunnable 1""this is a MyRunnable 2""this is a MyRunnable 3"
欢迎大家指正…
阅读全文
0 0
- QT 多线程(QThread)里调用线程池(QThreadPool )与主界面进行通讯
- Qt线程与线程池实现对比(QThread QThreadPool)
- QT线程池实验研究与分析(QThread与和QThreadPool + QRunnable使用上的区别)
- QT线程池实验研究与分析(QThread与和QThreadPool + QRunnable使用上的区别)
- Qt 多线程(QThreadPool)
- Qt 线程基础(QThread、QtConcurrent、QThreadPool等)
- Qt 线程基础(QThread、QtConcurrent、QThreadPool等)
- Qt线程(QThread)
- qt线程 qthread(转)
- Qt之线程(QThread)
- Qt之线程(QThread)
- Qt之线程(QThread)
- Qt线程(QThread)的使用/简介
- QT线程池的使用:QThreadPool类和QRunnable类
- 性能特性测试系列4——QT线程与std::thread(下)之QThread
- Qt: 多线程,继承QThread,重写run(理论+实例)
- Qt多线程操作界面---在QThread更新QProgressBar
- Qt多线程操作界面---在QThread更新QProgressBar
- Myeclipse错误:Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project
- 【POJ】3045
- OSX上pf的简单配置笔记
- STM8学习笔记三----按键实验
- React 组件解耦之道
- QT 多线程(QThread)里调用线程池(QThreadPool )与主界面进行通讯
- JavaScript中SetInterval与setTimeout的用法详解
- bzoj1500维修数列splay
- java设计模式之--工厂模式
- UnityShader顶点动画实现Mage-Fiers漂移效果
- 真实、迅雷、QQ旋风下载地址转换
- C++ Template实例化(13)---《C++ Templates》
- 编程之美2.16-最长递增子序列(Longest Subsequence)
- SpringMVC和Struts2的区别