如果由于接收对象的线程已结束而未处理Qt信号,参数会被删除吗?

If Qt signals aren't handled because the receiving object's thread has ended, will the arguments be deleted?

本文关键字:参数 信号 删除 Qt 未处理 对象 于接收 线程 结束 如果      更新时间:2023-10-16

考虑对象A绑定到线程T1和参数为QList<QVariantMap>是从线程T2启动的。

信号在A的事件循环中排队,但在处理之前,A的线程(T1)被退出。QList<sig1的QVariantMap>参数显然是在堆栈上分配的,我猜它应该自行清理。

但什么时候?也许当QThread对象本身被破坏时?有人在这方面有专门的知识吗?在我的系统中,这个线程不会简单地运行一次并在关闭时结束。它可能会启动,运行数小时,然后退出,稍后再启动。

如果线程以正确的方式终止(如),则参数不会被删除

QThread t;
t.exit();
t.wait();

现在你断言

QList<sig1的QVariantMap>参数显然分配在堆栈

这并不明显。因为接收线程需要在延迟执行中使用数据,所以emit(myVariantList)最终将导致myVariantList的副本。您不知道副本将被分配到哪里。

现在允许发布带有最终数据的事件,即经典的

Mywidget m;
m.show(); <-- this post at least one event
app.exec();

那些发布的事件需要保存,以防最终执行事件循环。我相信,如果持有事件循环的对象没有被销毁,或者用户没有明确要求删除事件,那么它们将在QObject的生命周期中保留。