Какую абстракцию использовать для драйвера ASynchronous Dat a Collection

Я хотел бы реализовать механизм в моем серверном приложении, но я не уверен, какая абстракция OTL будет наиболее подходящей.

Мое приложение собирает данные о различных типах оборудования. Некоторые из них используют синхронную связь, таким образом генерируя событие Delphi в моем серверном приложении. (push-like) Некоторые из них используют асинхронную связь, требуя, чтобы мое приложение периодически запрашивало последние доступные данные. (тянуть как)

Поскольку я хочу, чтобы мое серверное приложение оставалось отзывчивым, запрашивая как можно чаще новые доступные данные, я хочу поместить этот "драйвер извлечения" в отдельный поток, который будет запрашивать все настроенные точки данных одну за другой.

Я бы хотел, чтобы мой основной поток порождал этот объект OTL, а затем получил результат как событие delphi в основном потоке. Это будет эмулировать "push-like", для которого основной код моего сервера уже создан. Думайте об этом как о потоке, который вы запускаете, который периодически запрашивает данные, которые вы хотите отслеживать, и отправляет вам событие только тогда, когда значение изменилось.

Какая абстракция OTL (высокий уровень? Низкий уровень?), По вашему мнению, подходит для такого поведения?

Спасибо.

1 ответ

Я не уверен, что OTL дает вам большую пользу здесь, если честно. Я пишу много классов для управления аппаратными устройствами, и модель классов почти всегда является простой TThread Потомок. OTL хорош для выделения задач и рабочих пакетов, очередей, параллельных вычислений и т. Д. В этом случае, однако, вы не хотите делать ничего из этого. Вам нужен класс, который моделирует ваше устройство и инкапсулирует функции, которые он может выполнять.

Это будет отдельный рабочий поток, предназначенный для прокачки операций чтения и записи на устройство. Это будет долгоживущий поток, который будет существовать до тех пор, пока класс, который инкапсулирует устройство, останется живым - TThread имеет смысл для этого. Ваш поток будет представлять собой простой цикл, который выполняется непрерывно, опрашивая все необходимые данные и сбрасывая любые запросы на запись.

Этот класс также будет служить кешем данных для параметров устройства, и вам потребуются какие-то устройства синхронизации (мьютекс, критическая секция и т. Д.) Для защиты операций чтения и записи в эти поля через свойства, поэтому снова имеет смысл, что эти объекты синхронизации также существуют как поля класса и что ваш поток и модель класса живут вместе в одной сущности. Если вам нужны уведомления о событиях, они слишком удобно переносятся в одну и ту же модель. Одно устройство, один поток, один класс. Это идеальная работа для TThread Потомок.

Другие вопросы по тегам