Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 05:56

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 01:45 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Уже долгое время прыгаю из крайности в крайность. Не могу определиться.
Автомат читает входы. Сложились условия - выполнение необходимых действий.
Событийная система. Ожидание событий. По событиям и текущему состоянию выполнение необходимых действий.
Активный опрос VS пассивное ожидание.
В первом случае "событиями" могут быть флаги, переменные, состояния КА.
При написании одного проекта мне понадобился именно событийный подход. Сначала решил сделать буфер, но возникли трудности (об этом позже). Сделал проще: переменная Events. Возникло событие, закидываем в переменную номер события. Где требуется, проверяем, если есть событие, то в соответствии с состоянием запускаем нужный обработчик события. Если требуется, КА переводятся в нужные состояния. Дальше варианты. Работаем дальше или по условиям выполняем требуемые действия.
Проект работает, но теперь мне понадобился буфер сообщений. И затруднение в том, что не понятно как быть с неактуальными сообщениями. Событие может обработаться сразу. Обработали событие, удалили. Если процесс не в том состоянии, чтобы сразу обработать событие, то оно спокойно ждет своего часа в буфере. Но вот как бы с событиями, если они стали неактульны. Буфер может быть засран событиями, которые в данный момент уже нахрен не нужны. И если мы считаем, программа может повести себя самым непредсказуемым образом. Можно просто очистить буфер. Но вдруг в данный момент там нужное сообщение, и процесс в данный момент занят другими делами.
Ваши предложения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 01:51 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3937
Откуда: КЧР, поселок Нижний Архыз
Я в одном своем велосипеде просто использовал очереди POSIX для общения процессов. Можно добавлять в сообщение внутри очереди временную метку, тогда неактуальные записи просто можно будет игнорировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 02:39 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 322
Исповедуйте статистический подход к обработке событий. Поддерживайте просто объем буфера. Сделайте его регулируемым. Поставьте регулятор (ПИД), смотрите на внешние проявления. Отправляйте внешние проявления (артефакты) на вход ПИД регулятора. В результате получим аналоговую систему на цифровой основе. Ну должен же маятник качнуться в обратную сторону?


Последний раз редактировалось AstraHard 07 окт 2014, 02:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 02:44 
Старожил

Зарегистрирован: 06 окт 2014, 20:14
Сообщения: 322
Шутки шутками, а современные версии Windows кажись так и поступают, она уже способна потерять события на ровном месте, толи-еще будет ой ой ой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 06:42 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
пиши на асме!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 10:00 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3937
Откуда: КЧР, поселок Нижний Архыз
AstraHard писал(а):
Шутки шутками, а современные версии Windows кажись так и поступают, она уже способна потерять события на ровном месте, толи-еще будет ой ой ой.

Это ж каким надо быть ССЗБ, чтобы программировать под игровую прошивку?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 07 окт 2014, 10:57 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
http://www.kit-e.ru/articles/circuit/2007_1_146.php

А в своих ГА (гламурных автоматах) я сделал очередь сообщений и не парюсь протуханием событий. Если автомат не отреагировал на нажатие кнопки, значит оно ему и не надо было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 08 окт 2014, 21:47 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
demiurg1978 писал(а):
Ваши предложения.

Проверка актуальности события внутри процесса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 08 окт 2014, 23:35 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2619
Откуда: Москва
Цитата:
А в своих ГА (гламурных автоматах) я сделал очередь сообщений и не парюсь протуханием событий. Если автомат не отреагировал на нажатие кнопки, значит оно ему и не надо было.

+1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 08 окт 2014, 23:50 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Mirmik писал(а):
demiurg1978 писал(а):
Ваши предложения.

Проверка актуальности события внутри процесса.

Ага, значит все-таки этот момент...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 16 окт 2014, 08:10 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Слушайте, а как тогда быть, если возникла какая-либо аварийная ситуация? В модуле цикла работы оборудования идет непосредственный опрос. В случае аварийной ситуации выставляются переменные, флаги. Тут подход Татарчевского с сообщениями абсолютно неприемлем. Пропустили сообщение и все, приехали.
В данный момент в этом у меня затруднение. Непонятно, что чем обзывать. Событие, сообщение, флаг, переменная? Соответственно, непонятно, что выставлять. Ну а в случае, если обзывать сообщением, да еще в добавок у Татарчевского сообщения сбрасываются в следующем цикле после генерации сообщения...
На данный момент есть несколько рабочих проектов, где в модуле вывода информации на дисплей реализован опрос флагов, переменных. В определенных состояниях конечных автоматов свой набор флагов и переменных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 16 окт 2014, 10:09 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2619
Откуда: Санкт-Петербург
Очередь с приоритетами. Классика же. Реализаций тьма, самая простая - отдельная очередь на высокоприоритетные события.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 16 окт 2014, 11:21 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
Один фиг надо флаги проверять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 22 окт 2014, 10:10 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
http://www.kit-e.ru/articles/circuit/2007_1_146.php

А в своих ГА (гламурных автоматах) я сделал очередь сообщений и не парюсь протуханием событий. Если автомат не отреагировал на нажатие кнопки, значит оно ему и не надо было.

Поймал один момент. Есть конечный автомат. Читает сообщения, при чтении сообщения сбрасываются. Есть подавтоматы. Тоже читает эти же сообщения. В этом случае сообщения никогда не дойдут до подавтоматов. Потому что сообщения при чтении тут же помечаются как неактивные. Теперь рассмотрим ситуацию. В главном автомате задействованы один коды кнопок. В подавтоматах другие. К примеру:
Код:
void proc_main_fsm (void)
{
   switch (_proc_main_fsm)
   {
      case 0:
         break;

      case 1:
         if (Get_Event (EV_ID_KEY_PRESSED)) // Читаем сообщение, при чтении оно сбрасывается.
         {
            switch (GetKeyCode ())
            {
               case 0:
                  break;
            }
         }
         break;

      case 2:
         switch (_proc_sub_fsm_1)
         {
            case 0:
               if (Get_Event (EV_ID_KEY_PRESSED)) // Соответственно, здесь мы уже сообщение никогда не прочитаем.
               {
                  switch (GetKeyCode ())
                  {
                     case 1:
                        break;
                  }
               }
               break;
         }
         break;
}


Ваши предложения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 22 окт 2014, 11:02 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
1. Если кнопок немного, то на каждую кнопку свое сообщение
2. Очевидно же, не сбрасывать сообщение, если оно не обработалось
3. У меня не возникало ситуации, когда событие нужно блокировать и не пускать ниже ни в коем случае. Поэтому я их сбрасываю не при чтении
4. Сообщения, которые висят дольше чем один цикл - это не сообщения, а семафоры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 22 окт 2014, 15:20 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 616
Откуда: Киев
Я сделал следующим образом:
1) сообщения внутри автоматов не сбрасываются. Так одно сообщение может доходить до нескольких автоматов.
2) в конце цикла активное сообщение сбрасывается процедурой обработки активных сообщений. То есть все автоматы могли отреагировать на сообщение, и оно больше не нужно.
3) аварийные состояния и сообщения, на которые обязательно нужно реагировать, лучше назвать семафорами. И их сброс должен быть только внутри автоматов.
4) процедура обработки семафоров не сбрасывает семафоры, а если на семафор нет реакции, то вызывает свой обработчик исключительных ситуаций, по смыслу семафоров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Межпроцессное взаимодействие. События
СообщениеДобавлено: 23 окт 2014, 20:00 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Пересмотрел подход. Как я уже писал, у меня разделены управление циклом оборудования и вывод информации на дисплей. В модуле вывода за основу взято Micro Menu. Этот проект хорошо коррелируется с моим подходом активно использовать таблицы данных. Как известно, больше данных, меньше программа, и наоборот.
Режима меню как такового нет. В Micro Menu своя переменная-состояние меню. Так что и используем исходный режим вывода рабочей информации в качестве нулевого состояния Micro Menu. Дальше, разделяем аварийные ситуации на критичные и некритичные. Некоторые некритичные ситуации отображаются в состоянии вывода рабочей информации. Остальные и критичные - самостоятельные состояния Micro Menu.
Итог. Обработчик кнопок теперь вызывается в одном месте. И нет теперь мозголомства, как разрулить опрос кодов кнопок в автоматах и подавтоматах. Единственный момент, выход из некоторых критичных ситуаций только после устранения причины, или устранения причины и, например нажатия кнопки. Скажем, "Аварийный стоп" будет отображаться пока не отожмешь грибок аварийного стопа и нажмешь "Стоп". Неисправность датчика убирается нажатием на кнопку "Esc".

Структура menu:
Show


Show


Видео.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB