kiltum (kiltum) wrote,
kiltum
kiltum

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

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

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

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

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

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

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

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

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

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

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

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

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments