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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Небольшая проблема с обработкой сообщений, сброс флага "Сообщение пусто"
dxp
сообщение Jan 29 2011, 11:36
Сообщение #16


Adept
******

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



Цитата(sonycman @ Jan 29 2011, 15:15) *
Что касается модификации - к сожалению, я не смог с наскоку добавить сброс NonEmpty прямо в тело функции-оператора "=" так, чтобы не вызвать ошибки компилятора.
А дальше пока не стал копать, в принципе, вполне устраивает и так sm.gif

Можно попробовать как-то так:
Код
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; // чтение тела сообщения со сбросом внутреннего флага
    }


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


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

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



Цитата(dxp @ Jan 29 2011, 14:36) *
Можно попробовать как-то так:

Спасибо! a14.gif

А я пробовал просто вставить функцию внутрь класса 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(), а затем самим оператором Т ?
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 31 2011, 08:13
Сообщение #18


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. Не сразу вник в вопрос. Критические секции будут формироваться внутри функций, и это необходимо для их корректной работы. Вложенных секций нет (я сначала про это подумал - протупил), две секции, каждая в своем коде (функции), это нормально.


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


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

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



Цитата(dxp @ Jan 31 2011, 11:13) *
Upd. Не сразу вник в вопрос. Критические секции будут формироваться внутри функций, и это необходимо для их корректной работы. Вложенных секций нет (я сначала про это подумал - протупил), две секции, каждая в своем коде (функции), это нормально.

А, может быть, тогда сменить статус NonEmpty на protected, убрать из функции квалификатор const и обнулять эту переменную напрямую, а не с помощью reset().

Это наиболее оптимальный способ, с генерированием только одной критич. секции.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 31 2011, 14:53
Сообщение #20


Adept
******

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



Цитата(sonycman @ Jan 31 2011, 19:19) *
А, может быть, тогда сменить статус NonEmpty на protected, убрать из функции квалификатор const и обнулять эту переменную напрямую, а не с помощью reset().

Это наиболее оптимальный способ, с генерированием только одной критич. секции.

Секция все равно останется - просто она выйдет на уровень этого оператора (определенного в наследнике), сбрасывающего NonEmpty. При обращении к представлению объектов сервисов должна быть обеспечена атомарность доступа, поэтому без критической секции не обойтись.


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


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

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



Цитата(dxp @ Jan 31 2011, 17:53) *
Секция все равно останется - просто она выйдет на уровень этого оператора (определенного в наследнике), сбрасывающего NonEmpty. При обращении к представлению объектов сервисов должна быть обеспечена атомарность доступа, поэтому без критической секции не обойтись.

Конечно, останется, но только одна - которая определяется в операторе.
А в случае с использованием функции reset() - добавится вторая, совершенно не нужная, внутри этой функции.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 1 2011, 03:21
Сообщение #22


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();
    }  
};

Где тут дополнительная секция?


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


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

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



Цитата(dxp @ Feb 1 2011, 06:21) *
Я так вижу, что мы про разное говорим. Я про свой пример:

В вашем примере критическая секция сначала формируется внутри reset(), а затем внутри оператора.
Всего два раза.
Но ведь можно сделать оптимальнее:
Код
INLINE operator     T()     { TCritSect cs; NonEmpty = false; return Msg; }

всего с одной критической секцией.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 1 2011, 12:02
Сообщение #24


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), вы сможете сделать свою версию сообщения так, как вам нравится.


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


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

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



Цитата(dxp @ Feb 1 2011, 15:02) *
...скоро будет новый релиз, в нем можно создавать пользовательские сервисы (для этого там будет документированный API), вы сможете сделать свою версию сообщения так, как вам нравится.

"Будем ждать, будем настороже!" (с) Капитан Смолетт. sm.gif

Особенно интересна фича по мониторингу стёка.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Feb 1 2011, 14:56
Сообщение #26


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 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), вы сможете сделать свою версию сообщения так, как вам нравится.

Сорри, не дочитал до конца. Судя по всему в этом направлении есть изменения! Здорово, буду ждать!
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 2 2011, 03:55
Сообщение #27


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ные классы сервисов.


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

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

 


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


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