【Qt】QThread安全退出

文章探讨了如何在Qt中使用智能指针和deleteLater函数来管理和释放线程资源,强调了QThread的生命周期、QObject的deleteLater机制以及两种线程安全的资源释放方法:信号槽连接和主动调用deleteLater配合析构函数。
摘要由CSDN通过智能技术生成

指针的内存释放有智能指针,那么线程资源的释放该如何是好呢
前提:需要了解QThread生命周期、QThread成员函数
文章已备好,公主请查看
QThread生命周期
QThread成员函数

为确保线程的安全退出,那么我们需要有序释放资源
当然,如果你不在意内存泄漏,那不释放也不是不行(doge)

QObject给我们提供了一个很好的机制,完成时释放void QObject::deleteLater()
官方文档中对其介绍如下

Schedules this object for deletion.
The object will be deleted when control returns to the event loop. If the event loop is not running when this function is called (e.g. deleteLater() is called on an object before QCoreApplication::exec()), the object will be deleted once the event loop is started. If deleteLater() is called after the main event loop has stopped, the object will not be deleted. Since Qt 4.8, if deleteLater() is called on an object that lives in a thread with no running event loop, the object will be destroyed when the thread finishes.
Note that entering and leaving a new event loop (e.g., by opening a modal dialog) will not perform the deferred deletion; for the object to be deleted, the control must return to the event loop from which deleteLater() was called. This does not apply to objects deleted while a previous, nested event loop was still running: the Qt event loop will delete those objects as soon as the new nested event loop starts.
Note: It is safe to call this function more than once; when the first deferred deletion event is delivered, any pending events for the object are removed from the event queue.
Note: This function is thread-safe.
See also destroyed() and QPointer.

关键内容有以下几点

  1. deleteLater是延迟删除,安排删除该对象。
  2. 首先deleteLater()是QObject对象的一个函数, 要想使用此方法, 必须是一个QObject对象。
  3. deleteLater()依赖于Qt的event loop机制。
  4. 如果在event loop启用前被调用, 那么event loop启用后对象才会被销毁。
  5. 如果在event loop结束后被调用, 那么对象不会被销毁。
  6. 如果在没有event loop的thread使用, 那么thread结束后销毁对象。
  7. 可以多次调用此函数。

PS:线程安全
使用方法

deleteLater()实现原理

void QObject::deleteLater()
{
    QCoreApplication::postEvent(this, new QDeferredDeleteEvent());
}
...
bool QObject::event(QEvent *e)
{
    switch (e->type()) {
    ....
    case QEvent::DeferredDelete:
        qDeleteInEventHandler(this);
        break;
    ....
    }
}
...
void myWidget(QObject *o)
{
    delete o;
}

方法一,直接连接信号槽
connect(thd,&QThread::finished ,thd,&QObject::deleteLater);
方法二,主动调用,线程析构等待
// myWidget
thd->deleteLater();
// myThread
myThread::~myThread()
{
	exit();
	wait();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值