QThread类提供了一个独立于平台的方式来管理线程。一个QThread对象管理程序内的控制的一个线程。QThread只有run()函数是在新线程里。默认情况下,run()通过调用exec()启动事件循环并在线程内运行Qt事件循环。
在旧版本中官方推荐的是该方法,在Qt4.8之后就建议moveToThread了。在文档中也能看到该方法示例。
引用一段文档描述:
线程将在run()函数返回后退出。除非你调用exec(),否则线程中不会运行任何事件循环。
重要的是要记住,QThread实例存在于实例化它的旧线程中,而不是在调用run()的新线程中。这意味着所有QThread的排队插槽都将在旧线程中执行。因此,希望在新线程中调用插槽的开发人员必须使用工作者 - 对象方法; 不应将新插槽直接实现到子类QThread。
在继承QThread时,请记住构造函数在旧线程中执行,而run()在新线程中执行。如果从两个函数访问成员变量,则从两个不同的线程访问该变量。检查这样做是否安全。(所以还是moveToThread好用啊)
class WorkerThread : public QThread
{
Q_OBJECT
void run() override {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &s);
};
void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}
可用exec()开启时间循环,或者QEventLoop。
4.使用QRunnable先看看文档说明:
QRunnable类是所有Runnable对象的基类。
QRunnable类是一个接口,用于表示需要执行的任务或代码段,通过重新实现run()函数来表示。
可以使用QThreadPool在单独的线程中执行代码。如果autoDelete()返回默认值true,QThreadPool会自动删除QRunnable。使用setAutoDelete()更改自动删除标志。
QThreadPool支持通过在run()函数中调用QThreadPool::tryStart(this)多次执行相同的QRunnable。如果启用了autoDelete,则当最后一个线程退出运行功能时,将删除QRunnable。启用autoDelete时,使用相同的QRunnable多次调用QThreadPool::start()会创建竞争条件,不建议这样做。
通过查看QThreadPool的文档,可以看到相关描述及代码示例:
QThreadPool类管理QThreads的集合。
QThreadPool管理和重新处理各个QThread对象,以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用getinstance()来访问它。
要使用其中一个QThreadPool线程,请继承QRunnable并实现run()虚函数。然后创建该类的对象并将其传递给QThreadPool::start()。
QThreadPool默认自动删除QRunnable。使用QRunnable::setAutoDelete()更改自动删除标志。
QThreadPool支持通过从QRunnable::run()中调用tryStart(this)多次执行相同的QRunnable。如果启用了autoDelete,则当最后一个线程退出运行功能时,将删除QRunnable。启用autoDelete时,使用相同的QRunnable多次调用start()会创建竞争条件,不建议这样做。
在一段时间内未使用的线程将过期。默认的到期超时为30000毫秒(30秒)。可以使用setExpiryTimeout()更改此设置。设置负到期超时会禁用到期机制。
调用maxThreadCount()以查询要使用的最大线程数。如果需要,您可以使用setMaxThreadCount()更改限制。默认的maxThreadCount()是QThread::idealThreadCount()。activeThreadCount()函数返回目前做的线程数工作。
reserveThread()函数保留外用线程。完成线程后使用reserveThread(),以便可以重用它。实质上,这些函数会临时增加或减少活动线程数,并且在实现QThreadPool不可见的耗时操作时非常有用。
请注意,QThreadPool是用于管理线程的低级类,请参阅Qt Concurrent模块以获取更高级别的替代方案。
class HelloWorldTask : public QRunnable
{
void run()
{
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?