如果由于接收对象的线程已结束而未处理Qt信号,参数会被删除吗?
If Qt signals aren't handled because the receiving object's thread has ended, will the arguments be deleted?
考虑对象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
的生命周期中保留。
相关文章:
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt5 - 如何将"QList<T> *"指针作为信号参数传递,并在完成后将其删除?
- Qt moveToThread,带有参数的信号/插槽
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 使用 enum 参数将 C++ 对象信号连接到 QML 信号处理程序
- 当通过引用传递 QObject 时,C++信号的参数在 QML 中显示为"未定义"
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- q_property通知信号及其参数
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- Qt:在 selectionchanged() 信号中传递一个参数
- Qt - 使用λ函数修改先前连接信号的插槽参数
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- Qt信号和插槽:是复制的参考参数
- 如何将信号作为函数参数传递
- boost::信号与来自静态成员函数的参数
- 提升 1.55,而 13 信号参数错误数
- C++当被ctrl-c中断时,在死亡之前调用带有参数(信号号除外)的函数