微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果在调用QObject :: connect之前发出信号,如何避免竞争?

如何解决如果在调用QObject :: connect之前发出信号,如何避免竞争?

在Qt中,如果我在连接信号的同时可以发出信号,如何避免出现竞争状况?

考虑以下简单示例:

MySignalSender *sender = new MySignalSender(); // starts async operation that emits `fooSignal`
// <-- Possibility (1): `fooSignal` can be emitted here
MySignalReceiver *receiver = new MySignalReceiver();
// <-- Possibility (2): `fooSignal` can be emitted here
QObject::connect(sender,&MySignalSender::fooSignal,receiver,&MySignalReceiver::fooslot);
// <-- Possibility (3): `fooSignal` can be emitted here or later

由于fooSignal是从另一个线程发出的,因此调度程序在运行时会不确定地实现可能性1-3的选择。虽然只有在第三种情况下才能实现所需的行为,但在其余两种情况下,我们会丢失信号,很可能导致死锁或某些其他未定义的行为。

Qt是否提供某种原子机制来暂时暂停来自对象的信号?我知道QObject::blockSignals(),但是我的理解是,这完全抑制了信号,而不是仅仅延迟一会儿。

提前谢谢!

解决方法

一种选择是简单地更改构造发送信号的对象的方式。您可以将对象的构造与异步操作的开始分开。

MySignalSender *sender = new MySignalSender();
MySignalReceiver *receiver = new MySignalReceiver();
QObject::connect(sender,&MySignalSender::fooSignal,receiver,&MySignalReceiver::fooSlot);

sender->startAsyncOperations();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。