多线程刷新UI, 用QThreadPool和QRunnable实现

本文介绍了如何利用Qt库中的QThreadPool和QRunnable来实现多线程,特别是在需要异步刷新UI控件的场景下。通过创建线程类并连接信号槽,可以实现在后台线程中执行任务并安全地更新UI。虽然在尝试打印线程ID时遇到一些困难,但整个框架已经成功地展示了线程池的工作原理。

线程池QThreadPool实现多线程, 信号槽实现异步线程刷新UI控件

启动效果

调用是没有问题

这里本来是想打印出线程ID, 不知道怎么用

QString(QThread::currentThread()

输出, 怎么转换成QString


文档结构


线程类

printtask.h

#ifndef PRINTTASK_H
#define PRINTTASK_H
#include <QObject>
#include <QRunnable>
class PrintTask : public QObject, public QRunnable
{
    Q_OBJECT
signals:
    void notify(QString);
public:
    PrintTask();
    ~PrintTask();
protected:
    void run();
signals:
    //注意!要使用信号,采用QObejct  QRunnable多继承,记得QObject要放在前面
    void mySignal();
};
#endif // PRINTTASK_H

printtask.cpp

#include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl;
PrintTask::PrintTask()
{
}
PrintTask::~PrintTask()
{
}
//线程真正执行的内容
void PrintTask::run()
{
    QString printf;
    printf = tr("PrintTask run called");
    //printf.append(QString(QThread::currentThread()));
    //cout << "PrintTask run 被调用,调用线程ID为:" << QThread::currentThread() << endl;
    emit notify(printf);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public slots:
   void notify(QString print);
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl;
PrintTask::PrintTask()
{
}
PrintTask::~PrintTask()
{
}
//线程真正执行的内容
void PrintTask::run()
{
    QString printf;
    printf = tr("PrintTask run called");
    //printf.append(QString(QThread::currentThread()));
    //cout << "PrintTask run 被调用,调用线程ID为:" << QThread::currentThread() << endl;
    emit notify(printf);
}


这里的传送类型可以随便设置, int 或者 QString.

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值