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

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

|
Цитата(sonycman @ Jan 29 2011, 15:15)  Что касается модификации - к сожалению, я не смог с наскоку добавить сброс NonEmpty прямо в тело функции-оператора "=" так, чтобы не вызвать ошибки компилятора. А дальше пока не стал копать, в принципе, вполне устраивает и так  Можно попробовать как-то так: Код template <typename T> class my_message : public OS::message<T> { public: INLINE const T& operator=(const T& msg) { return OS::message<T>::operator=(msg); } INLINE operator T() { reset(); return OS::message<T>::operator T(); } }; ... my_message<int> Slonick;
... // process 1 Slonick = 10; Slonick.send();
... // process 2 if(Slonick.is_non_empty()) { A = Slonick; // чтение тела сообщения со сбросом внутреннего флага }
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 29 2011, 15:16
|

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

|
Цитата(dxp @ Jan 29 2011, 14:36)  Можно попробовать как-то так: Спасибо! А я пробовал просто вставить функцию внутрь класса message вот так: Код INLINE operator T() const { TCritSect cs; reset(); return Msg; } на что получаю такую ошибку: Цитата Error[Pe1086]: the object has cv-qualifiers that are not compatible with the member function "OS::message<T>::reset" Вроде бы наследующий класс должен получать доступ ко всем public членам наследуемого? ЗЫ: в Вашем примере будет дважды формироваться критическая секция? Сначала внутри reset(), а затем самим оператором Т ?
|
|
|
|
|
Jan 31 2011, 08:13
|

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

|
Цитата(sonycman @ Jan 29 2011, 21:16)  А я пробовал просто вставить функцию внутрь класса message вот так: Код INLINE operator T() const { TCritSect cs; reset(); return Msg; } на что получаю такую ошибку: Это потому, что фукнция объявлена с квалификатором const - в этой функции все члены класса рассматриваются как константные и изменять представление класса нельзя. А функция reset его изменяет. Надо const тут убрать. Цитата(sonycman @ Jan 29 2011, 21:16)  Вроде бы наследующий класс должен получать доступ ко всем public членам наследуемого? К пабликам имеют доступ все. Производные имеют доступ еще к защищенным (protected). Цитата(sonycman @ Jan 29 2011, 21:16)  ЗЫ: в Вашем примере будет дважды формироваться критическая секция? Сначала внутри reset(), а затем самим оператором Т ? Да. Лишние секции можно, очевидно, убрать. Upd. Не сразу вник в вопрос. Критические секции будут формироваться внутри функций, и это необходимо для их корректной работы. Вложенных секций нет (я сначала про это подумал - протупил), две секции, каждая в своем коде (функции), это нормально.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 31 2011, 13:19
|

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

|
Цитата(dxp @ Jan 31 2011, 11:13)  Upd. Не сразу вник в вопрос. Критические секции будут формироваться внутри функций, и это необходимо для их корректной работы. Вложенных секций нет (я сначала про это подумал - протупил), две секции, каждая в своем коде (функции), это нормально. А, может быть, тогда сменить статус NonEmpty на protected, убрать из функции квалификатор const и обнулять эту переменную напрямую, а не с помощью reset(). Это наиболее оптимальный способ, с генерированием только одной критич. секции.
|
|
|
|
|
Jan 31 2011, 14:53
|

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

|
Цитата(sonycman @ Jan 31 2011, 19:19)  А, может быть, тогда сменить статус NonEmpty на protected, убрать из функции квалификатор const и обнулять эту переменную напрямую, а не с помощью reset().
Это наиболее оптимальный способ, с генерированием только одной критич. секции. Секция все равно останется - просто она выйдет на уровень этого оператора (определенного в наследнике), сбрасывающего NonEmpty. При обращении к представлению объектов сервисов должна быть обеспечена атомарность доступа, поэтому без критической секции не обойтись.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 1 2011, 03:21
|

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

|
Цитата(sonycman @ Jan 31 2011, 22:16)  Конечно, останется, но только одна - которая определяется в операторе. А в случае с использованием функции reset() - добавится вторая, совершенно не нужная, внутри этой функции. Я так вижу, что мы про разное говорим. Я про свой пример: Код INLINE operator T() { reset(); return OS::message<T>::operator T(); } }; Где тут дополнительная секция?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 1 2011, 08:10
|

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

|
Цитата(dxp @ Feb 1 2011, 06:21)  Я так вижу, что мы про разное говорим. Я про свой пример: В вашем примере критическая секция сначала формируется внутри reset(), а затем внутри оператора. Всего два раза. Но ведь можно сделать оптимальнее: Код INLINE operator T() { TCritSect cs; NonEmpty = false; return Msg; } всего с одной критической секцией.
|
|
|
|
|
Feb 1 2011, 12:02
|

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

|
Цитата(sonycman @ Feb 1 2011, 14:10)  В вашем примере критическая секция сначала формируется внутри reset(), а затем внутри оператора. Всего два раза. Но ведь можно сделать оптимальнее: Код INLINE operator T() { TCritSect cs; NonEmpty = false; return Msg; } всего с одной критической секцией. Мы пошли по кругу. То, что вы предлагаете - это изменение функционала штатного сервиса, что имеет побочные эффекты. Я вам предложил решение, как сделать производный сервис без модификации базового сервиса. Накладные расходы на еще одну секцию мизерны - это, как правило, пара быстрых регистровых команд процессора. Если вас не устраивает такое решение, подождите некоторое время, как сказал Сергей, скоро будет новый релиз, в нем можно создавать пользовательские сервисы (для этого там будет документированный API), вы сможете сделать свою версию сообщения так, как вам нравится.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 1 2011, 14:56
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(dxp @ Jan 29 2011, 09:31)  Я все-таки не понимаю, почему нельзя просто дописать свой код, который нужен. Или функцию, которая делает опрос и сброс, или, если уж так хочется работать непосредственно с объектом, отнаследоваться от message, добавить там свой operator=(), который будет сбрасывать внутренний флаг и выдавать наружу тело сообщения, как штатный оператор. Кстати помните наш диалог про то, что неплохо было бы сделать все (большинство) методов и полей под квалификатором protected а не private, для того, чтоб наследоваться и расширять функционал класса. Вот пример, когда это было бы весьма кстати. А так товарищу формально нужно будет менять код ОС, чтоб иметь возможность отнаследоваться. Цитата(dxp @ Feb 1 2011, 15:02)  Если вас не устраивает такое решение, подождите некоторое время, как сказал Сергей, скоро будет новый релиз, в нем можно создавать пользовательские сервисы (для этого там будет документированный API), вы сможете сделать свою версию сообщения так, как вам нравится. Сорри, не дочитал до конца. Судя по всему в этом направлении есть изменения! Здорово, буду ждать!
|
|
|
|
|
Feb 2 2011, 03:55
|

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

|
Цитата(jorikdima @ Feb 1 2011, 20:56)  Кстати помните наш диалог про то, что неплохо было бы сделать все (большинство) методов и полей под квалификатором protected а не private, для того, чтоб наследоваться и расширять функционал класса. Большинство функций-членов там вообще public. Приватные функции по пальцам можно пересчитать. Цитата(jorikdima @ Feb 1 2011, 20:56)  Вот пример, когда это было бы весьма кстати. А так товарищу формально нужно будет менять код ОС, чтоб иметь возможность отнаследоваться. В данном случае это ничего бы не дало. Все представление, к которому нужен доступ, досягаемо через открытые функции-члены. В этом контексте имело бы смысл делать данные protected, но это как-то уже не совсем хорошо. Основной идеологический посыл в том, что классы сервисов не предназначены для непосредственного расширения. Для расширения будет предоставлен специальный механизм, на основе которого будут реализованы и штaные классы сервисов.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|