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

|
Здравствуйте. Помогите пожалуйста разобраться с использованием очереди сообщений. У меня есть процесс (A), периодически передающий пакеты по UART. Второй процесс (  может в произвольные моменты требовать от него передачи пакетов, определяемых пользователем. Для этого я собираюсь использовать очередь сообщений. Но ведь в очередь заносится только указатель на пакет, а как быть с самими данными, особенно если пришло несколько запросов подряд? Правильно ли я понимаю, что мне необходимо помимо очереди создать что-то вроде кольцевого буфера и обернуть функции POST и PEND для очереди сообщений в свои функции, которые будут брать/класть указатель из/в очереди, извлекать данные из буфера и обслуживать указатели этого буфера? Спасибо. PS. Пока писал сообщение, в голову пришла ещё одна мысль - процесс B динамически выделяет память, а процесс A после вычитывания сообщения её освобождает.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
 |
Ответов
|
Nov 29 2009, 02:14
|
Участник

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

|
Цитата В шаблонную очередь (пример выше) мы можем класть не только объектры ELEMENT, но и наследников от него. Это про "разные сообщения" боюсь, что в шаблонную очередь вы положите указатель на объект, а не элемент. если элемент, то вы его потом не распознаете (плюс у разных объектов разный размер). а в случае указателя, ну да, компилятор сделает за вас работу по идентификации объекта (а точнее, будет работать динамический полиморфизм с виртуальными функциями). если всю программу принципиально писать в стиле си++, то ваш подход корректен. если же плюсы избыточны для данной задачи, то и не надо парить моск с обертками. тем более что если вы точно знаете, что в очереди указатель на ELEMENT или производный от него, то при передаче приведите его к void*, а при получении к ELEMENT*. и никаких проблем. никакого лишнего кода.
|
|
|
|
|
Nov 29 2009, 10:52
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 29 2009, 17:33
|
Участник

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

|
Цитата(Сергей Борщ @ Nov 29 2009, 13:52)  Гм... Зачем тут void *? Почему бы не приводить к ELEMENT * сразу при передаче? И зачем тут вообще приведение? если функция отправки в очередь принимает только void*, то при ее вызове надо все приводить к void*  это избавит от варнингов в различных компиляторах. Цитата имеет смысл не полениться написать обертку для работы с нормальными средствами языка, а не использовать затычку void*. с т.з. языка - да. а с т.з. получившегося кода? гробим и память, и быстродействие.
|
|
|
|
Сообщений в этой теме
Harvester Использование очереди сообщений Nov 27 2009, 08:25 Dima_G Все зависит от того - что подразумеватеся под элем... Nov 27 2009, 08:32 Harvester Цитата(Dima_G @ Nov 27 2009, 11:32) Все з... Nov 27 2009, 08:45  Dima_G Цитата(Harvester @ Nov 27 2009, 12:45) В ... Nov 27 2009, 08:53   Harvester Цитата(Dima_G @ Nov 27 2009, 11:53) Ну а ... Nov 27 2009, 11:38    zltigo Цитата(Harvester @ Nov 27 2009, 14:38) А ... Nov 27 2009, 11:59     Dima_G Цитата(zltigo @ Nov 27 2009, 15:59) Нафиг... Nov 27 2009, 12:23      zltigo Цитата(Dima_G @ Nov 27 2009, 15:23) Под б... Nov 27 2009, 13:03       Harvester Цитата(zltigo @ Nov 27 2009, 16:03) И есл... Nov 27 2009, 13:41        zltigo Цитата(Harvester @ Nov 27 2009, 16:41) Чт... Nov 27 2009, 15:42         Dima_G Цитата(zltigo @ Nov 27 2009, 18:42) Повер... Nov 27 2009, 16:11          zltigo Цитата(Dima_G @ Nov 27 2009, 19:11) Это я... Nov 27 2009, 16:49           dxp Цитата(zltigo @ Nov 27 2009, 22:49) C++ т... Nov 28 2009, 09:30            zltigo Цитата(dxp @ Nov 28 2009, 12:30) Вы хотит... Nov 28 2009, 10:07             Dima_G Цитата(zltigo @ Nov 28 2009, 13:07) Приче... Nov 28 2009, 17:40              zltigo Цитата(Dima_G @ Nov 28 2009, 20:40) Это п... Nov 28 2009, 18:03             dxp Цитата(zltigo @ Nov 28 2009, 16:07) Я хоч... Nov 29 2009, 15:55              zltigo Цитата(dxp @ Nov 29 2009, 18:55) Нет ни о... Dec 3 2009, 08:09               Dima_G Цитата(zltigo @ Dec 3 2009, 11:09) Вы пох... Dec 3 2009, 08:26              zltigo Цитата(dxp @ Nov 29 2009, 18:55) все выше... Dec 3 2009, 08:58               dxp Цитата(zltigo @ Dec 3 2009, 14:58) Самые ... Dec 4 2009, 09:18                Dima_G Цитата(dxp @ Dec 4 2009, 12:18) Не ... Dec 4 2009, 09:50                zltigo Цитата(dxp @ Dec 4 2009, 12:18) добавив ч... Dec 4 2009, 10:06                 dxp Цитата(zltigo @ Dec 4 2009, 16:06) И выну... Dec 5 2009, 07:22         Harvester Цитата(zltigo @ Nov 27 2009, 18:42) Вопро... Nov 30 2009, 07:36       Dima_G Цитата(zltigo @ Nov 27 2009, 16:03) Еруда... Nov 27 2009, 14:57     Harvester Цитата(zltigo @ Nov 27 2009, 14:59) Нафиг... Nov 27 2009, 12:47 Andron_ ЦитатаДинамически выделять / освобождать память не... Nov 27 2009, 15:12   Сергей Борщ Цитата(Ink @ Nov 29 2009, 19:33) если фун... Nov 30 2009, 01:18    Ink Цитата(Сергей Борщ @ Nov 30 2009, 04:18) ... Dec 2 2009, 10:32     dxp Цитата(Ink @ Dec 2 2009, 16:32) согласен,... Dec 3 2009, 07:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|