|
Небольшая проблема с обработкой сообщений, сброс флага "Сообщение пусто" |
|
|
|
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?
|
|
|
|
Сообщений в этой теме
sonycman Небольшая проблема с обработкой сообщений Jan 26 2011, 19:33  dxp Цитата(sonycman @ Jan 27 2011, 11:41) Да,... Jan 27 2011, 08:50   sonycman Цитата(dxp @ Jan 27 2011, 11:50) Мне каже... Jan 27 2011, 11:03    dxp Цитата(sonycman @ Jan 27 2011, 17:03) Ну ... Jan 28 2011, 03:45 Сергей Борщ Если не используется ожидание сообщения, то какой ... 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
|
|
|