|
Небольшая проблема с обработкой сообщений, сброс флага "Сообщение пусто" |
|
|
|
Jan 26 2011, 19:33
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Доброго времени суток! Организую взаимодействие между двумя процессами с помощью сообщений. Один процесс отправляет сообщение, другой - принимает. Почему то казалось, что после считывания сообщения оператором = его статус автоматически устанавливается на "пусто". Поэтому делал так: CODE //thread 1 command_message.send(); response_message.wait(); ...
//thread 2 if (command_message.is_non_empty()) { message_placeholder = command_message; ... response_message.send(); ... }
Оказалось, что это не так, и необходимо после считывания принудительно сбрасывать сообщение функцией reset(). Но, может быть, удобнее было бы сделать автоматический сброс флага NonEmpty после отрабатывания оператора присваивания?
|
|
|
|
|
 |
Ответов
|
Jan 27 2011, 04:52
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(sonycman @ Jan 27 2011, 01:33)  Доброго времени суток!
Организую взаимодействие между двумя процессами с помощью сообщений. Один процесс отправляет сообщение, другой - принимает.
Почему то казалось, что после считывания сообщения оператором = его статус автоматически устанавливается на "пусто". Поэтому делал так:
...
Оказалось, что это не так, и необходимо после считывания принудительно сбрасывать сообщение функцией reset().
Но, может быть, удобнее было бы сделать автоматический сброс флага NonEmpty после отрабатывания оператора присваивания? Не очень понял, что не получалось. Логика работы OS::message (как и OS::TEventFlag) такова, что внутренний флаг NonEmpty взводится только в случае, если посылается сообщение, которое еще никто не ждет. В этом случае, когда какой-то процесс встанет на ожидание сообщения, он сразу обнаружит, что оно уже послано - по этому внутреннему флагу, в этом случае флаг NonEmpty автоматически сбрасывается. Если при вызове OS::message::send уже были ожидающие этого сообщения процессы, то эти процессы переводятся в состояние готовых к выполнению, а внутренний этот флаг NonEmpty не устанавливается - в этом просто нет необходимости - кто ждал, те и так получат управление в очередности, соответствующей их приоритетам. Таким образом, вам достаточно было дождаться сообщения с помощью функции OS::message::wait, после этого спокойно можно читать тело сообщения. Никаких проверок (is_non_empty и т.п.) не нужно. Это штатный способ использования.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 27 2011, 05:41
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(dxp @ Jan 27 2011, 07:52)  Таким образом, вам достаточно было дождаться сообщения с помощью функции OS::message::wait, после этого спокойно можно читать тело сообщения. Никаких проверок (is_non_empty и т.п.) не нужно. Это штатный способ использования. Да, как работает функция wait() я понял, и к ней претензий нет. Но дело в том, что в моём случае обрабатывающий сообщение процесс - высокоприоритетный и весьма загруженный, и вставать на ожидание функцией wait() нет возможности. Поэтому делается проверка на наличие сообщения функцией is_non_empty(), и далее обработка сообщения только в случае его наличия. То есть получается такая ситуация: 1. низкоприоритетный процесс отправляет сообщение высокоприоритетному. Последний в это время ожидает другое событие и не может обработать сообщение, поэтому внутри send() устанавливается флаг NonEmpty. 2. процесс получатель высвобождается и проверяет наличие сообщения, а затем вычитывает его оператором =. 3. Приходится вызовом reset() сбрасывать установленный флаг. Можно ли избежать третьего пункта, добавив в обработчик оператора = сброс NonEmpty?
|
|
|
|
|
Jan 27 2011, 08:50
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(sonycman @ Jan 27 2011, 11:41)  Да, как работает функция wait() я понял, и к ней претензий нет. Но дело в том, что в моём случае обрабатывающий сообщение процесс - высокоприоритетный и весьма загруженный, и вставать на ожидание функцией wait() нет возможности.
Поэтому делается проверка на наличие сообщения функцией is_non_empty(), и далее обработка сообщения только в случае его наличия.
То есть получается такая ситуация: 1. низкоприоритетный процесс отправляет сообщение высокоприоритетному. Последний в это время ожидает другое событие и не может обработать сообщение, поэтому внутри send() устанавливается флаг NonEmpty. 2. процесс получатель высвобождается и проверяет наличие сообщения, а затем вычитывает его оператором =. 3. Приходится вызовом reset() сбрасывать установленный флаг. Т.е. по сути вы занимаетесь поллингом сообщения. Поллинг - "ручной" опрос и обработка. Поэтому все правильно - руками опросили, приняли решение, сбросили, если надо. Цитата(sonycman @ Jan 27 2011, 11:41)  Можно ли избежать третьего пункта, добавив в обработчик оператора = сброс NonEmpty? Дело в том, что сообщения имеют возможность работать широковещательно (как и флаги событий). Т.е. одного и того же сообщения могут ждать несколько приемников. Если сделать, как вы предлагаете, то один приемник чтением сбросит готовность сообщения и другие приемники пропустят это событие. Т.е. тут имеется побочный эффект. Мне кажется, что у вас тут на уровне проектирования не совсем ладно. У вас получается, что процесс может одновременно ждать несколько сообщений, тогда в этом случае целесообразно применять не message, а channel. Тогда процесс просто ждет любого сообщения из канала, как только оно пришло, вычерпывает его оттуда и обрабатывает. А источники сообщений в своем темпе пихают сообщения в канал. А message хорошо подходит для оповещения и для передачи по схеме источник-приемник, в обоих случаях приемники должны ожидать сообщения. message менее функциональный, но и менее накладный способ коммуникации.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 27 2011, 11:03
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(dxp @ Jan 27 2011, 11:50)  Мне кажется, что у вас тут на уровне проектирования не совсем ладно. У вас получается, что процесс может одновременно ждать несколько сообщений, тогда в этом случае целесообразно применять не message, а channel. Тогда процесс просто ждет любого сообщения из канала, как только оно пришло, вычерпывает его оттуда и обрабатывает. А источники сообщений в своем темпе пихают сообщения в канал. Ну что же, Вам виднее. А мой процесс занимается загрузкой данных в память и передачей их по DMA. В качестве сигнала готовности DMA использую event flag. Не дай бог сильно затянуть с реакцией на загрузку DMA, а если тут под ногами ещё будет путаться второстепенное сообщение... Думаю, что канал в этом случае лишний.
|
|
|
|
Сообщений в этой теме
sonycman Небольшая проблема с обработкой сообщений Jan 26 2011, 19:33 Сергей Борщ Если не используется ожидание сообщения, то какой ... Jan 28 2011, 09:23 sonycman Цитата(Сергей Борщ @ Jan 28 2011, 12:23) ... Jan 28 2011, 11:56  dxp Цитата(sonycman @ Jan 28 2011, 17:56) Упр... Jan 28 2011, 12:48   sonycman Цитата(dxp @ Jan 28 2011, 15:48) Кстати, ... Jan 28 2011, 13:41    dxp Цитата(sonycman @ Jan 28 2011, 19:41) Но,... Jan 28 2011, 13:55     sonycman Цитата(dxp @ Jan 28 2011, 16:55) Без ОС п... Jan 28 2011, 14:09      Сергей Борщ QUOTE (sonycman @ Jan 28 2011, 16:09) Тут... Jan 28 2011, 16:01 dxp Я все-таки не понимаю, почему нельзя просто дописа... Jan 29 2011, 06:31 sonycman Мне просто было интересно, почему авторы не предус... Jan 29 2011, 09:15 dxp Цитата(sonycman @ Jan 29 2011, 15:15) Что... Jan 29 2011, 11:36  sonycman Цитата(dxp @ Jan 29 2011, 14:36) Можно по... Jan 29 2011, 15:16   dxp Цитата(sonycman @ Jan 29 2011, 21:16) А я... Jan 31 2011, 08:13    sonycman Цитата(dxp @ Jan 31 2011, 11:13) Upd. Не ... Jan 31 2011, 13:19     dxp Цитата(sonycman @ Jan 31 2011, 19:19) А, ... Jan 31 2011, 14:53      sonycman Цитата(dxp @ Jan 31 2011, 17:53) Секция в... Jan 31 2011, 16:16       dxp Цитата(sonycman @ Jan 31 2011, 22:16) Кон... Feb 1 2011, 03:21        sonycman Цитата(dxp @ Feb 1 2011, 06:21) Я так виж... Feb 1 2011, 08:10         dxp Цитата(sonycman @ Feb 1 2011, 14:10) В ва... Feb 1 2011, 12:02          sonycman Цитата(dxp @ Feb 1 2011, 15:02) ...скоро ... Feb 1 2011, 13:33 jorikdima Цитата(dxp @ Jan 29 2011, 09:31) Я все-та... Feb 1 2011, 14:56 dxp Цитата(jorikdima @ Feb 1 2011, 20:56) Кст... Feb 2 2011, 03:55
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|