Существует ли алгоритм для планирования перекрывающихся команд включения / выключения?

#c #asynchronous #timer #scheduled-tasks #glib

#c #асинхронный #таймер #запланированные задачи #glib

Вопрос:

Проблема, которую я хочу решить, заключается в следующем:

перекрывающееся планирование включения / выключения

Каждая задача (зеленая полоса) представляет собой пару команд включения (зеленая пунктирная линия) и выключения (красная пунктирная линия). Задачи могут перекрываться или не перекрываться друг с другом. Это приложение реального времени, в котором мы не знаем, когда или если появится другая задача. Цель состоит в том, чтобы включить клапан, если он еще не включен, и избежать преждевременного отключения клапана.

Что я имею в виду, говоря «не выключать клапан преждевременно», так это то, что, например, если мы выключаем клапан во время выключения-1, это неправильно, потому что клапан все еще должен оставаться включенным в этот момент времени, правильное действие — выключить клапан во время выключения-4.

Что касается деталей реализации, каждая задача является асинхронной задачей (через . GLib async API). Я имитирую ожидание продолжительности задачи с помощью функции ожидания, таймер, вероятно, более уместен. Прямо сейчас задачи выполняются независимо, и между ними нет координации, поэтому клапан отключается преждевременно.

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

Комментарии:

1. Существует тег «асинхронный». Если задачи являются будущими событиями (а не «действовать сейчас») как со временем запуска, так и со временем остановки, при этом событие 6, возможно, сообщается до события 5, я бы использовал связанный список, вставляя и / или объединяя новое расписание с элементами в списке.

Ответ №1:

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