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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Использование очереди сообщений
dxp
сообщение Nov 28 2009, 09:30
Сообщение #16


Adept
******

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



Цитата(zltigo @ Nov 27 2009, 22:49) *
C++ тут АБСОЛЮТНО ни причем - на любом языке можете наваять оберток не имеющих никакого смысла и главное годящихся только для частного случая. Изобразить, например, "специальную очередь" для какого-либо фрейма можно по любому, только кроме лишнего исходного текста и лишних сущностей такие выкрутасы не дают ничего.

Вы хотите сказать, что очередь на основе void* ничем не хуже очереди на основе TypeName*? С точки зрения удобства и безопасности использования.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 28 2009, 10:07
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dxp @ Nov 28 2009, 12:30) *
Вы хотите сказать, что очередь на основе void* ничем не хуже очереди на основе TypeName*? С точки зрения удобства и безопасности использования.


Я хочу сказать, что TypeName* ничем не лучше и делать нечто самодельное похожее на очередь ВМЕСТО механизма очередей системы, по причине того, что очередь с void* есть глупость.

Причем эта поделка не годится, если мы в очередь кладем разные сообщения. Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой. Родить какую-нибудь конструкцию, например
Цитата
#define put_typename( x ) { TypeName *tmp = x; put( tmp ); }

для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 28 2009, 17:40
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(zltigo @ Nov 28 2009, 13:07) *
Причем эта поделка не годится, если мы в очередь кладем разные сообщения. Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой. Родить какую-нибудь конструкцию, например

для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.



Ничего личного, но сразу видно отличие Сишного стиля мышления от Сиплюсового. wink.gif
В шаблонную очередь (пример выше) мы можем класть не только объектры ELEMENT, но и наследников от него. Это про "разные сообщения"
Далее - насчет "запихнуть не то - невозвожно". Да леко!
Я кончено понимаю, что специалист Вашего уровня никогда не ошибается, но у меня могут быть промашки - при 10 очередях и 20 типах объектов, которые "гуляют" по ним. И любые средства языка, которые хоть немного могут это предотвратить, я очень приветствую.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 28 2009, 18:03
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dima_G @ Nov 28 2009, 20:40) *
Это про "разные сообщения"

А, блин, при выемке распознавать святым духом.... Зачем мелкие дежурные "мероприятия".
Цитата
Ничего личного, но сразу видно отличие Сишного стиля мышления от Сиплюсового.

Разница много больше проявляется в отсутствии/наличии мышления.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ink
сообщение Nov 29 2009, 02:14
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776



Цитата
В шаблонную очередь (пример выше) мы можем класть не только объектры ELEMENT, но и наследников от него. Это про "разные сообщения"

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

если всю программу принципиально писать в стиле си++, то ваш подход корректен. если же плюсы избыточны для данной задачи, то и не надо парить моск с обертками. тем более что если вы точно знаете, что в очереди указатель на ELEMENT или производный от него, то при передаче приведите его к void*, а при получении к ELEMENT*. и никаких проблем. никакого лишнего кода.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 29 2009, 10:52
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Ink @ Nov 29 2009, 04:14) *
если вы точно знаете, что в очереди указатель на ELEMENT или производный от него, то при передаче приведите его к void*, а при получении к ELEMENT*.
Гм... Зачем тут void *? Почему бы не приводить к ELEMENT * сразу при передаче? И зачем тут вообще приведение? Если исходный имеет тип ELEMENT * или производный от него, приведение будет выполнено неявно. Если тип совсем другой - то какой смысл его класть в эту очередь, ведь при извлечении получим ELEMENT*, как мы узнаем, что тип был совсем другой?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 29 2009, 15:55
Сообщение #22


Adept
******

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



Цитата(zltigo @ Nov 28 2009, 16:07) *
Я хочу сказать, что TypeName* ничем не лучше

Лучше принципиально. Наличием четкого статического контроля типов.

Цитата(zltigo @ Nov 28 2009, 16:07) *
и делать нечто самодельное похожее на очередь ВМЕСТО механизма очередей системы, по причине того, что очередь с void* есть глупость.

Если системная очередь ограничена в виду используемого "системного" яыка С типом void*, то при наличие возможностей ++ имеет смысл не полениться написать обертку для работы с нормальными средствами языка, а не использовать затычку void*.

Цитата(zltigo @ Nov 28 2009, 16:07) *
Причем эта поделка не годится, если мы в очередь кладем разные сообщения.

Сообщения - как типы одной иерархии. В очередь - указатель на базовый тип. Извлечение - вызов виртуальной функции. Все просто, прозрачно, наглядно, безопасно.

Цитата(zltigo @ Nov 28 2009, 16:07) *
Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой.

Ну, не все же такие "укротители кода", большинству людей свойствено ошибаться. И код пишется часто не только для себя. И цель - так спроектировать программу, чтобы в ней в идеале не было ни одного ручного преобразования типов (что, к сожалению, не всегда удается, но реально оправданные случаи - это, как правило, стыковка с "железом" - например, преобазование целого в адрес (указатель)). И не зря не последние люди в Computer Science говорят, что ручное преобразование типа чаще всего указывает на ошибку проектирования.

Цитата(zltigo @ Nov 28 2009, 16:07) *
для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.

Да, на С ничего, кроме костылей не получается. Именно поэтому и появился С++ - именно как средство устранения горбатостей предка, с сохранением совместимости, но без костылей. И сегодня уже достаточно все это развито и доступно. Нет ни одной причины не использовать. И уж если некогда/не хочется/лень/т.п. в плане использования - это личное дело, но и обосновывать эту позицию тоже ни к чему - за этим ничего, кроме личного субъективизма нет.

P.S. Знаю вас как сложившегося, квалифицированного специалиста, ни разу не сомневаюсь, что все вышеприведенное вас ни в чем не убедило. Т.ч. это скорее не к вам пост, а просто как флаг того, что есть и другое мнение по этому вопросу. Для сомневающихся, так сказать. smile.gif


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


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776



Цитата(Сергей Борщ @ Nov 29 2009, 13:52) *
Гм... Зачем тут void *? Почему бы не приводить к ELEMENT * сразу при передаче? И зачем тут вообще приведение?

если функция отправки в очередь принимает только void*, то при ее вызове надо все приводить к void* smile.gif это избавит от варнингов в различных компиляторах.
Цитата
имеет смысл не полениться написать обертку для работы с нормальными средствами языка, а не использовать затычку void*.

с т.з. языка - да. а с т.з. получившегося кода? гробим и память, и быстродействие.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 30 2009, 01:18
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Ink @ Nov 29 2009, 19:33) *
если функция отправки в очередь принимает только void*, то при ее вызове надо все приводить к void* smile.gif это избавит от варнингов в различных компиляторах.
Тут вы глубоко ошибаетесь. К void* любой не-cv (не const и не volaile) указатель приводится неявно, о чем ясно написано в стандарте. Если компилятор на это выдает предупреждение - надо писать его разработчикам используя примерно такие идиомы: cranky.gif maniac.gif Вы ведь не приводите к void * при вызове memcpy(), memset()?


Цитата(Ink @ Nov 29 2009, 19:33) *
с т.з. языка - да. а с т.з. получившегося кода? гробим и память, и быстродействие.
грамотно написанная обертка работает на этапе компиляции. Не отнимая ни байта, ни такта на этапе выполнения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Harvester
сообщение Nov 30 2009, 07:36
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(zltigo @ Nov 27 2009, 18:42) *
Вопросы кто чем для кого является smile.gif возможен взгляд с разных сторон smile.gif. В очередь кладется указатель чтения - по нему процесс передачи читает из буфера, то, что он будет передавать smile.gif. Указатель записи это принадлежность функции, которая заполняет буфер передачи - по нему будет занесен фрейм и его значение до занесения фрейма будет помещено в очередь.

То, что Вы пытаетесь описать, вообще буфера не требует smile.gif, поскольку Вы упорно предполагаете, что в кольцевом буфере по определению рассчитанном на МНОГО фреймов лежит ОДИН. Для одного нужен ОДИН указатель - нет вопросов. Если Мы действительно используем кольцевой буфер, как буфер, а не лишнюю приблуду, то в нем могут лежать МНОГО фреймов, для них нужно МНОГО указателей. Эти указатели и лежат в очереди до того момента, когда процесс передачи извлечет очередной и начнет по нему вытаскивать из буфера информацию.


Видимо, я не совсем понятно выразился unsure.gif. Говоря об ОДНОМ указателе я имел в виду именно указатель, который процесс команд помещает в очередь и который является "независимым" от очереди. Естественно, процесс передачи будет работать с другим указателем, который он возьмет из очереди.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Ink
сообщение Dec 2 2009, 10:32
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 14-08-07
Пользователь №: 29 776



Цитата(Сергей Борщ @ Nov 30 2009, 04:18) *
Тут вы глубоко ошибаетесь.

да нет же, я просто немного попутал laughing.gif

Цитата(Сергей Борщ @ Nov 30 2009, 04:18) *
грамотно написанная обертка работает на этапе компиляции. Не отнимая ни байта, ни такта на этапе выполнения.

согласен, но когда сиплюсплюсники ведут речь о виртуальных функциях - это уже другой случай, на этапе компиляции не получится.
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 3 2009, 07:24
Сообщение #27


Adept
******

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



Цитата(Ink @ Dec 2 2009, 16:32) *
согласен, но когда сиплюсплюсники ведут речь о виртуальных функциях - это уже другой случай, на этапе компиляции не получится.

Так виртуальные функции дают качественно новый функционал. Если его реализовать средствами С, то получится то же самое по ресурсам и гора вспомогательного кода, загромождающего основной. Если функциональность, даваемая виртуальными функциями, не нужна, то и не надо их использовать.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 3 2009, 08:09
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dxp @ Nov 29 2009, 18:55) *
Нет ни одной причины не использовать. И уж если некогда/не хочется/лень/т.п. в плане использования - это личное дело, но и обосновывать эту позицию тоже ни к чему - за этим ничего, кроме личного субъективизма нет.

Вы похоже потеряли то, с чего собственно начались мои возражения sad.gif. Напомню.
Было предложено при имеющейся системе "сделать свою очередь" . На мое возражение, что в таком случае городить самодельные очереди не надо, было отвечено "Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы". И так далее..... до
"сразу видно отличие Сишного стиля мышления от Сиплюсового" smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Dec 3 2009, 08:26
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(zltigo @ Dec 3 2009, 11:09) *
Вы похоже потеряли то, с чего собственно начались мои возражения sad.gif. Напомню.
Было предложено при имеющейся системе "сделать свою очередь" . На мое возражение, что в таком случае городить самодельные очереди не надо, было отвечено "Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы". И так далее..... до

Никто нить не терял smile.gif. Здесь я своего мнения не изменю - если в качестве языка выбран С++, нужно использовать его возможности. Например - типизацию элемента очереди. Зачем мне системные очереди, которые все приводят к void* ?

Цитата(zltigo @ Dec 3 2009, 11:09) *
"сразу видно отличие Сишного стиля мышления от Сиплюсового" smile.gif


Если это Вас задело - извиняюсь. Я вкладывал в эту фразу следующий смысл
"Сишник работает с данными, как с куском памяти. Плюсовик - как с объектом"
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 3 2009, 08:58
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dxp @ Nov 29 2009, 18:55) *
все вышеприведенное вас ни в чем не убедило. Т.ч. это скорее не к вам пост, а просто как флаг того, что есть и другое мнение по этому вопросу. Для сомневающихся, так сказать. smile.gif

А должно было smile.gif? Самые главные плюсы плюсов, и это неизбежно, связаны с накладными расходами (и благодаря системному подходу эти расходы чаще всего МЕНЬШЕ, нежели неумелые реализации подобного на 'C' ), но именно в этом сила. Использование С++ только из-за того,что-бы местами в частных случаях избавится от какого-нибудь void * притянуто за уши sad.gif.
Цитата
Ну, не все же такие "укротители кода", большинству людей свойствено ошибаться.

Мне тоже - много и жестоко, только я точно могу сказать, что в 99% моих ошибок выявляющихся в процессе компиляции и легкой отладки и 99,999% ошибок выявляющихся в процессе эксплуатации используемый язык написания совсем не виноват sad.gif.
P.S.
В 90x мне пришлось столкнуться с ADA - был один телекоммуникационный проект на западников. Вот уж язык,который старались создавать,как безошибочный, но доведенный до абсурда в том числе и с заветной целью военных взять военных специалистов и они все безошибочно напишут все, что и как нужно военным. Так вот, человек,который руководил поминаемым мной проектом, будучи и оставаясь ярым ADA-вцем буквально сбежал разорвав контракт с большими для себя потерями, когда в его предыдущий военный проект начали прикомандировывать военных специалистов прошедших курс обучения языку ADA. Им, и это совершенно естественно, легко удавалось делать умопомрачительное количество ошибок.
Цитата(Dima_G @ Dec 3 2009, 11:26) *
Если это Вас задело - извиняюсь. Я вкладывал в эту фразу следующий смысл
"Сишник работает с данными, как с куском памяти. Плюсовик - как с объектом"

Вы НИЧЕГО не знаете о программировании. Совсем sad.gif Не путайте дурное "программирование", с Программированием.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:22
Рейтинг@Mail.ru


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