Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2012, 16:02   #1
ShadowMaster
 
Регистрация: 14.08.2008
Сообщений: 8
Вопрос IPC в Windows

Здравствуйте.
Есть такая задача. Таблица ком сервера генерирует событие при появлении новых данных. Есть дллки в которых описана функция возвращающая указатель на созданный объект, который в дллки и записан. И вот при старте приложения мы получаем список указателей на созданные классы и в событие, от ком-сервера помещаем метод от этого класса. Ну пусть событие например будет void OnGetData(int a). Если у нас много длл загружено, то будет так:
//-----------
void OnGetData(int a) {
DllClass1->Ins_Data(a);
DllClass2->Ins_Data(a);
...................................
DllClassN->Ins_Data(a);
}

Но вот проблема. Если длл много, то событие будет обрабатываться очень долго, а это не хорошо. Тогда возникает идея создать например Pipe в хост приложении и все все наши классы из длл создают себе по потоку и этим потоком смотрят в пайп.
Тогда событие от ком сервера(OnGetData) будет просто писать в пайп и это будет гарантированно быстро происходить(быстрее, чем отправлять данные в дллку и ждать возвращение из расчетов). Но как я понимаю, пайп позволяет обмениваться данными только 1-1, т.е. не может 1 процесс писать и 10 процессов слушать. Как я понял, можно видимо это решить через мейл слот, но не понял, как слушать несколькими клиентами 1 слот. Нужно, чтобы была гарантия, что данные будут обработаны в том же порядке в котором пришли. Пусть приходит 1,2,3. Вот мы записали в пайп/слот 1. Все длл прочитали его. Но у первой обработалось все быстро, а у второй чуть дольше, а за это время пришло 2. Первая длл уже считает с двойкой, а вторая еще не обработала 1.Теперь пришло 3. Теперь первая длл обработала 3, а вторая длл обработала 1. Теперь вторая длл должна поставить на обработку 2, а не 3. Ну и так далее. Вообщем главное правильный порядок обработки данных из пайпа/слота каждой дллкой. Создавать для каждого потока свой пайп/слот для прослушки кажется избыточным. Ведь данные то одинаковые для всех идут. Подскажите пожалуйста, как решить данную задачу? Может надо использовать не пайпы или слоты, а что-то другое? Как вообще решают в адекватном мире задачу, когда данные от одного события надо распихать большой группе процессов/потоков-клиентов? Если можно, то пример кода приведите( хотя бы простенький, пусть событие генерится OnGetData(a), а функции, которым нужны от него данные будут void summ(int a){return a+a;}). Действие происходит в C++ Builder 2007 + WinXp Sp3. И да, не принципиально, ком сервер ли генерирует событие или просто кнопка, я его упомянул для полноты картины.
ShadowMaster вне форума Ответить с цитированием
Старый 26.07.2012, 17:31   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Если есть общая память (т.е. все в одном процессе) тогда можно сделать очередь. Генерация события записывает в конец очереди а у каждого читателя свой указатель на начало очереди. Если общей памяти нет, тогда надо одним пайпом читать из източника и в кучу других пайпов сбрасывать.

Насколько я помню ето все называется PUBLISH/SUBSCRIBE
waleri вне форума Ответить с цитированием
Старый 26.07.2012, 18:05   #3
ShadowMaster
 
Регистрация: 14.08.2008
Сообщений: 8
По умолчанию

А почему MailSlot не подходит? В вики написано:
" Если несколько серверных процессов внутри домена создадут маилслоты с одинаковым именем, то сообщения, адресованные этому маилслоту и посылаемые в домен, будут приниматься всеми создавшими его процессами."
про очередь я, конечно, почитаю, но мне бы пример кода глянуть бы... Вот про мейл слот я примеры нашел, они достаточно простые. Но пока не совсем понял, как этот "мультикаст" организовать. В гугле вагон примеров про то, как 1 сервер и 1 клиент взаимодействуют через мейлслот. Хотя в этом случае вроде оно работает аналогично пайпу. Ведь основной изюминкой слотов является этот самый "мультикаст". А так да, все в одном процессе. Не знаю является ли эта очередь сообщений аналогичной просто виндовс сообщениям, но ведь гарантии 100% доставки там нету вроде как. Хотя может чушь несу? Механизм для меня новый, много не изведанного...
ShadowMaster вне форума Ответить с цитированием
Старый 26.07.2012, 18:13   #4
ShadowMaster
 
Регистрация: 14.08.2008
Сообщений: 8
По умолчанию

Может чего-то не понимаю, но мне кажется, что то, что я хочу выражается вот такой схемой:



Только я не уверен, что эта схема будет гарантировать строго последовательную передачу данных для случая, о котором я писал в первом посте(разная скорость обработки.
Но только я так понял, в моем случае все потоки, содержащие код класса из длл будут серверами(Read Only) судя по примерам с гугла.
//--------------
К картинке был такой комментарий:

"Для создания почтового ящика и получения дескриптора, который можно будет использовать в операциях ReadFile, почтовые серверы (программы считывания) вызывают функцию CreateMailslot. На одном компьютере может находиться только один почтовый ящик с данным именем, но один и тот же почтовый ящик может использоваться несколькими системами в сети, что обеспечивает возможность работы с ним нескольких программ считывания. "

А на схеме нарисовано, что сервер пишет, а клиенты читают. И в интернете много где пишут, что сервер по сути читалка сообщений клиентов, а не массовый рассылатель.
------------------------
Уловил суть. Читать можно по хендлу, отдаваемому созданием слота. Для записи надо получать дескриптор файла.

Последний раз редактировалось ShadowMaster; 26.07.2012 в 23:09.
ShadowMaster вне форума Ответить с цитированием
Старый 27.07.2012, 17:49   #5
ShadowMaster
 
Регистрация: 14.08.2008
Сообщений: 8
По умолчанию

Ну где же все гуру межпроцессного взаимодействия? Неужели никто не скажет, чем плохи мейл слоты и тп? Хотя бы подскажите, будет ли при использовании мейл слотов гарантироваться, что каждый читающий поток, прочитает все не прочитанные именно им сообщения? Т.е. был 1 мейл слот и 2 читающих потока. Но читающих с разной скоростью. Вот пришла 1, оба потока взяли ее, а потом первый поток закончил раньше и взял следующее число из слота. Но вот закончил второй поток. Какое число ему будет видно? Как из слота удаляются сообщения? Сами? Какой-то механизм, удаляющий их по факту прочтения? Я так понял этот файл имеет всегда нулевой вес. Значит они работают типо Ram диска в *nix? А если мы явно не удаляем сообщения, они не начнут сжирать всю память? В msdn как-то не очевидно для меня написано. Навигация происходит через функцию получения информации о слоте, хендлы вроде разные и вроде должны указывать на разные слоты(как в системе с сокетами(виртуальные каналы для каждого клиента)), но на деле файл-то одинаковый. Не получится ли так, что они будут видеть одну и туже очередь и GetslotInfo будет возвращать в параметрах не верные значения, если другой поток уже дергал ее? Ну там не тот некст мессадж или не тот некст мессадж сайз.... Подскажите пожалуйста.
ShadowMaster вне форума Ответить с цитированием
Старый 27.07.2012, 20:34   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от ShadowMaster Посмотреть сообщение
Хотя бы подскажите, будет ли при использовании мейл слотов гарантироваться, что каждый читающий поток, прочитает все не прочитанные именно им сообщения?
Нет, mailslot не гарантирует доставку сообщенией, и даже не уверен насчет очередности. Mailslot весьма похож на UDP. Я не понял, чем не нравится вариант с named pipe? Один получает данные а потом раскидывает "подписавшимся" клиентам по трубе - чем не нравится?.
waleri вне форума Ответить с цитированием
Старый 27.07.2012, 22:36   #7
ShadowMaster
 
Регистрация: 14.08.2008
Сообщений: 8
По умолчанию

Видимо просто не пониманием сути.) Мне все всем нравится, я описал задачи, которые мне нужны. Мне как-то не попадалось, чтобы писали про рассылку нескольким клиентам через именованный канал. Видел, что используется для схем 1-1, а для 1-2,1-3, 1-n не видел. Может быть плохо искал. Если не сложно, глянуть бы пример кода с нейм пайп где аналогичные задачи решаются... Я ж потому и прошу помощи на форуме, что ввиду нехватки знаний в области не могу самостоятельно определить, что мне нравится, а что нет.

PS Человек, который не знает, гуглит, выясняет, а как же сделать так, чтобы не изобретать велосипед. И естественно находит в инете картинку со схемой(которую я и привел). Так как раз мой случай. И тут оказывается, что нет гарантии очередности(хотя тут я не понимаю этого, ведь есть все параметры для прохода по слоту в поиске сообщений произвольной длины. А постятся они туда последовательно...) Вот я и пишу на форум, чтобы помогли разобраться.=)

Последний раз редактировалось ShadowMaster; 27.07.2012 в 22:46.
ShadowMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правда ли что Windows xp 64 определяет болше Оперативки чем Windows xp 32 subbota Операционные системы общие вопросы 4 03.06.2012 17:29
Собираюсь перейти с Windows на Linux, какой из дистирибутивов наиболее похож на Windows (Xp,7)? ivan.tiran Windows 5 09.03.2012 17:51
Проект (работа с БД) на Delphi XE2 на Windows 7 64. Будет ли эта программа корректно работать на Windows 7 32 ? Dux Общие вопросы Delphi 10 04.10.2011 19:33
Windows7,не работает HKEY_LOCAL_MACHINE\SOFTWARE\Microso ft\Windows NT\CurrentVersion\Windows\AppInit_D LLs ассемблер123 Windows 0 22.04.2010 18:30