Qt多线程应用--QRunnable
QT线程池的使用:QThreadPool类和QRunnable类
【Qt】多线程QRunnable
Qt线程之QRunnable的使用详解
QT线程池的使用:QThreadPool类和QRunnable类
QT线程池的使用:QThreadPool类和QRunnable类_我不是萧海哇~~~~的博客-CSDN博客
【Qt】多线程QRunnable
======================================
Qt线程之QRunnable的使用详解
https://blog.csdn.net/luoyayun361/article/details/97116972
【Qt】多线程QRunnable
用法
要使用QRunnable创建线程,步骤如下:
继承QRunnable。和QThread使用一样,首先需要将你的线程类继承于QRunnable。
重写run函数。还是和QThread一样,需要重写run函数,run是一个纯虚函数,必须重写。
使用QThreadPool启动线程。
和QThread的区别
与外界通信方式不同。由于QThread是继承于QObject的,所以可以在线程类中使用信号槽,但QRunnable没有继承于QObject,所以不能使用信号与槽。
启动线程方式不同。QThread线程可以直接调用start()函数启动,而QRunnable线程需要借助QThreadPool进行启动。
资源管理不同。QThread线程对象需要手动去管理删除和释放,而QRunnable则会在QThreadPool调用完成后自动释放。
————————————————
版权声明:本文为CSDN博主「heater404」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhudaokuan/article/details/130988994
Qt多线程应用--QRunnable
作为Qt类中少有的基类, QRunnable提供了简洁有效的可运行对象的创建. 用QRunnable来创建独立的运行对象来运行 不涉及界面元素的数据处理过程 非常合适.
优点: 创建过程简洁, 使用方便, 配合着自身的autoDelete特性, 有点“招之即来, 挥之即去”的感觉.
缺点: 无法实时提供自身的运行状态.
举个处理过程中反馈进度的例子
main.cpp
#include <QApplication>
#include <QProgressBar>
#include <QThreadPool>
#include "runnableInst.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QProgressBar progressBar;
progressBar.setValue(50);
progressBar.show();
runnableInst* hInst = new runnableInst(&progressBar);
QThreadPool::globalInstance()->start(hInst);
return app.exec();
}
runnableInst.h
#ifndef RUNNABLEINST_H
#define RUNNABLEINST_H
#include <QRunnable>
class QProgressBar;
class runnableInst : public QRunnable
{
public:
runnableInst(QProgressBar* progressBar);
virtual ~runnableInst();
void run();
private:
QProgressBar* m_ProgressBar;
};
#endif // RUNNABLEINST_H
runnableInst.cpp
#include "runnableInst.h"
#include <QTest>
#include <QProgressBar>
runnableInst::runnableInst(QProgressBar* progressBar)
: QRunnable(), m_ProgressBar(progressBar)
{
}
runnableInst::~runnableInst()
{
}
void runnableInst::run()
{
for(int step = 1; step <= 100; step++)
{
// 处理数据过程
//...
// 这两句只是测试用, 针对不同的环境可采用相应的进度反馈
QMetaObject::invokeMethod(m_ProgressBar, "setValue", Q_ARG(int, step));
QTest::qSleep(100);
//...
}
}
当QRunnable运行结束, 它自身会被销毁, 所以用不着担心内存泄露(除了指定设置setAutoDelete(false)); 不过要注意在数据或事件对象的处理~` 好比例子中QMetaObject::invokeMethod是比较危险的事!