реклама на сайте
подробности

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


Любитель
*****

Группа: Свой
Сообщений: 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 после отрабатывания оператора присваивания?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Jan 27 2011, 04:52
Сообщение #2


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 и т.п.) не нужно. Это штатный способ использования.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 27 2011, 05:41
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 27 2011, 08:50
Сообщение #4


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 менее функциональный, но и менее накладный способ коммуникации.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 27 2011, 11:03
Сообщение #5


Любитель
*****

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



Цитата(dxp @ Jan 27 2011, 11:50) *
Мне кажется, что у вас тут на уровне проектирования не совсем ладно. У вас получается, что процесс может одновременно ждать несколько сообщений, тогда в этом случае целесообразно применять не message, а channel. Тогда процесс просто ждет любого сообщения из канала, как только оно пришло, вычерпывает его оттуда и обрабатывает. А источники сообщений в своем темпе пихают сообщения в канал.

Ну что же, Вам виднее.

А мой процесс занимается загрузкой данных в память и передачей их по DMA.
В качестве сигнала готовности DMA использую event flag. Не дай бог сильно затянуть с реакцией на загрузку DMA, а если тут под ногами ещё будет путаться второстепенное сообщение...
Думаю, что канал в этом случае лишний.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 28 2011, 03:45
Сообщение #6


Adept
******

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



Цитата(sonycman @ Jan 27 2011, 17:03) *
Ну что же, Вам виднее.
...
Думаю, что канал в этом случае лишний.

Если напрягает ручной вызов двух функций, то ничего не мешает написать короткую встраиваемую функцию, которая будет объединять в себе проверку на наличие уже принятого сообщения и сброс внутреннего флага. И эту функцию одну в коде и вызывать. Весь интерфейс сервисы предоставляют, пользователь волен комбинировать как ему желается под свои конкретные цели и предпочтения. По реализации будет совершенно без разницы, как сбрасывается внутренний флаг - внутри функции-оператора или снаружи инлайновой функцией reset. А побочного эффекта во втором случае не будет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 12:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.02577 секунд с 7
ELECTRONIX ©2004-2016