June 30th, 2014

Программистко-алгоритмическое в понедельник ...

Предлагаю причастным к программированию размять мозг и заодно помочь мне :) Вдруг есть более приемлимое решение.

Дано: небольшой быстрый дивайс, который контролирует примерно 20 входов и 10 выходов. К этому дивайсу подключен очень медленный дисплей. Дисплей реально медленный. Перерисовка экрана полностью - около 10 секунд, если не больше. Но умеет перерисовывать только нужный кусочек. Входы меняются по одному-двое с частотой максимум 1Гц. Выходы меняются тыканьем пальца в дисплей.

Надо: отображать на дисплее состояние этих входов. На каждый вход просто две разные картинки (включен-выключен). На выходы еще и реагировать выставлением нужного в дивайсе.

Мое решение:
Внутри дивайса массив

флаг_направление - Состояние - флаг_перерисовки

Внутри дивайса крутятся два цикла в разных потоках.

Первый пробегает по всем входам-выходам, согласно флагу направления либо читает состояние, либо записывает. Если при чтении состояние различается от записанного в массиве, то записывает в массив и поднимает флаг_перерисовки. Запись значений наружу идет всегда - дивайс быстрый и пара миллисекунд никого не напрягает.

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

Что мне не нравится: дисплей очень медленный и второй цикл крутится с его скоростью. В результате может возникнуть классические гонки.

Когда первый цикл поднял флаг, второй начал перерисовывать, а в это время первый снова изменил значение и снова поднял флаг. И после всего этого второй закончив перерисовку, опускает флаг. В результате значение потеряется.

Пока придумал только то, что во втором цикле флаг надо опускать тут же, как только он его поймает, а уже потом начинать перерисовку. Тогда пространство для гонок очень резко сужается ...