用于异步数据收集驱动程序的抽象

时间:2017-08-09 10:18:14

标签: multithreading delphi asynchronous omnithreadlibrary

我想在我的服务器应用程序中实现一种机制,但我不确定哪种OTL抽象最合适。

我的应用程序收集有关各种类型设备的数据。 其中一些使用同步通信,因此在我的服务器应用程序中生成Delphi事件。 (推样) 其中一些使用异步通信,要求我的应用程序定期请求可用的最新数据。 (像拉一样)

因为我希望我的服务器应用程序在尽可能频繁地请求新的可用数据时保持响应,所以我想将“拉动驱动程序”放在一个单独的线程中,该线程将逐个请求所有已配置的数据点。

我希望我的主线程产生这个OTL对象,然后在主线程中接收结果作为delphi事件。这将模仿我的服务器主代码已经制作的“推式”。 您可以将其视为您启动的线程,该线程会定期请求您要监控的数据,并仅在值发生变化时向您发送事件。

您认为哪种OTL抽象(高级别?低级别?)适合此行为?

谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定OTL在这里给你带来多少好处,说实话。我编写了很多用于管理硬件设备的类,而类模型几乎总是一个普通的TThread后代。 OTL很适合分离任务和工作包,队列,并行计算等。但是,在这种情况下,你不想做任何这样的事情。你想要的是一个为你的设备建模并封装它可以执行的功能的类。

这将是一个专门用于抽取读取和写入设备的工作线程。只要封装设备的类保持活动状态,这将是一个长期存在的线程 - TThread对此有意义。您的线程将是一个连续运行的简单循环,轮询所有必需的数据并刷新任何写入请求。

该类还将用作设备参数的数据高速缓存,您将需要某种同步设备(互斥,临界区等)来保护通过属性对这些字段的读写,因此再次理解这些同步对象也作为类字段存在,并且您的线程和类模​​型在一个实体中共存。如果您想要事件通知,这些太方便地包装到同一个模型中。一个设备,一个线程,一个类。对TThread后代来说,这是一份完美的工作。