我正在编写一个模拟设备操作的程序(一次几个)。数据交换有条件地通过 RS-485 网络“发生”,即 该程序连接到网络并将“虚拟仪器”添加到网络中。它的实现如下: 1. 有一个对象“数据总线”。本质上是相同类型对象的容器。从一个 Send 对象接收会分发给所有其他对象。2. 总线对象。它们可能具有不同的功能,但它们实现了一个带有 Receive 功能(从总线接收数据)的基本接口。总线对象有两种类型:“虚拟设备”-(根据接收到的数据,进行计算并将结果“发送”到“总线”),“数据源”(例如,对象打开一个 COM端口,或 TCP,或其他,并将接收到的数据传输到“总线”,然后从总线返回到端口)。
所以。一切都很好。但我想把所有这些放在一个单独的线程中。这是干什么用的——所有对象“发起”事件(TNotifyEvent),例如 OnDataReceive、OnChanged 等。这些事件的处理(程序窗口中相关信息的视觉反映)可能需要“长时间”(对仿真至关重要)。因此,主设备(RS-485 总线上的真实设备)“丢失”了虚拟设备。
我无法想象完整的实现(因此实现它,不知道具体要做什么)。它看起来像这样: - 我们创建一个“总线”对象 - 我们创建 - 将必要的对象添加到“总线” - 我们启动流程(“RunEmulation”总线的某些方法),启动“数据源”对象. - 来自“源”的所有数据都被发送到仿真流,它被发送到接收者,被处理。- 在事件“发起”的情况下,将带有必要信息的 PostMessage 发送到总线,并且总线已经在主线程中调用了 OnDataReceive、OnChanged 等。(然后消息将被排队,用户处理不会影响仿真线程)
像这样的东西。也许有人解决了类似的问题,或者只是对正确的实施方法有想法
感谢大家。结果如下:1)处理消息的线程:
2)模拟器本身(来自数据总线的消息接收器):
3)数据总线(仿真器通知):
流中对象的所有 getter/setter 都被临界区“覆盖”。