gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:15:35 25 4
gpt4 key购买 nike

在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();

关于c++ - 如果在调用QObject::connect()之前发出信号,如何避免竞争?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64558539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com