我遇到的情况是我有一个发射器对象和一组接收器。接收器属于同一类别,实际上代表一组相同类型的设备。我正在使用Qt框架。
发射器本身首先会收到一个信号,要求从其中一个设备获取信息。
在相应的插槽中,发射器必须检查以查看哪些接收器已“就绪”,然后发送其自身的信号以向其中一个设备请求数据(以先准备好的那个为准)。
发射器非常快地接收信号,大约为毫秒。我可以考虑通过三种方式仅从其中一台设备安全地请求数据(这些设备位于各自的线程中,因此我需要一种线程安全的机制)。设备的数量不是静态的,并且可以更改。设备总数非常小(肯定在5
1)添加或删除所有设备时,请连接它们。发出一个请求,并让设备对象自己使用某些特定的设备标签过滤出该请求是否针对他们。该方法很好,因为执行检查的请求插槽将在专用线程的上下文中执行,但是随着设备数量的增加而浪费。
2)需要发送请求时,即时连接发射器内的对象并与之断开连接。
3)必要时使用QMetaObject :: invokeMethod()发送请求。
性能很重要。有谁知道哪种方法是“最好的”,或者是否有更好的方法?
问候
普里斯
注意:需要说明的是:发射器从应用程序获取信号,通过查询设备获取信息。疯狂的ASCII艺术去:
(app)(发射器)(接收器)|物理设备
最佳答案
根据您提供的信息,我仍然建议使用Reactor
实现。如果您不使用ACE,则可以实现自己的。基本架构如下:
从应用程序接收到信号或数据时,使用select
唤醒。
如果发送列表上已准备好套接字,则只需选择一个套接字并发送数据即可
发送数据后,Receiver
将从可用的套接字/处理程序集中删除自身
处理完数据后,Reciever
将其自身重新注册到可用收件人列表中。
我建议使用ACE
的原因是因为它具有使用最简单的Reactor
模式实现之一。