gpt4 book ai didi

c++ - 动态地向一组中的一个对象发射信号

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:27 25 4
gpt4 key购买 nike

我有一个情况,我有一个发射器对象和一组接收器。接收器属于同一类,实际上代表一组相同类型的设备。我正在使用 Qt 框架。

  • 发射器本身首先收到一个信号,要求从其中一个设备获取信息。

  • 在相应的槽中,发射器必须检查哪些接收器“准备就绪”,然后发送自己的信号以向其中一个设备请求数据(以先准备好的为准)。

发射器接收信号的速度非常快,以毫秒为单位。我可以想到三种方法来安全地仅从其中一个设备请求数据(这些设备存在于它们自己的线程中,因此我需要一种线程安全机制)。设备的数量不是静态的,可以改变。设备总数很少(肯定在 5-6 台以下)。

1) 添加或删除设备时连接到所有设备。发出一个请求,并让设备对象本身过滤掉该请求是否是针对它们的,使用一些特定的设备标签。这种方法很好,因为发生检查的请求槽将在专用线程的上下文中执行,但随着设备数量的增加会造成浪费。

2) 当需要发送请求时,在发射器中动态地连接和断开对象。

3) 在需要发送请求时使用 QMetaObject::invokeMethod()。

性能很重要。有谁知道哪种方法是“最好的”,或者是否有更好的方法?

问候

棱镜

注意:澄清一下:发射器从应用程序获取信号,通过查询设备获取信息。疯狂的 ASCII 艺术去:

(app)<---->(发射器)<------>(接收器)<--|-->物理设备

最佳答案

根据您提供的信息,我仍然会推荐Reactor 实现。如果您不使用 ACE,那么您可以实现自己的。基本架构如下:

  1. 使用 select 从 App 接收到信号或数据时唤醒。
  2. 如果发送列表中有准备好的套接字,那么您只需选择一个并向其发送数据
  3. 发送数据时,Receiver 将自己从可用的套接字/处理程序集中移除
  4. 处理完数据后,Reciever 会将自己重新注册到可用接收者列表中。

我推荐 ACE 的原因是因为它是 Reactor 模式最简单易用的实现之一。

关于c++ - 动态地向一组中的一个对象发射信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8781808/

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