|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.07.2012, 16:02 | #1 |
Регистрация: 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. И да, не принципиально, ком сервер ли генерирует событие или просто кнопка, я его упомянул для полноты картины. |
26.07.2012, 17:31 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Если есть общая память (т.е. все в одном процессе) тогда можно сделать очередь. Генерация события записывает в конец очереди а у каждого читателя свой указатель на начало очереди. Если общей памяти нет, тогда надо одним пайпом читать из източника и в кучу других пайпов сбрасывать.
Насколько я помню ето все называется PUBLISH/SUBSCRIBE |
26.07.2012, 18:05 | #3 |
Регистрация: 14.08.2008
Сообщений: 8
|
А почему MailSlot не подходит? В вики написано:
" Если несколько серверных процессов внутри домена создадут маилслоты с одинаковым именем, то сообщения, адресованные этому маилслоту и посылаемые в домен, будут приниматься всеми создавшими его процессами." про очередь я, конечно, почитаю, но мне бы пример кода глянуть бы... Вот про мейл слот я примеры нашел, они достаточно простые. Но пока не совсем понял, как этот "мультикаст" организовать. В гугле вагон примеров про то, как 1 сервер и 1 клиент взаимодействуют через мейлслот. Хотя в этом случае вроде оно работает аналогично пайпу. Ведь основной изюминкой слотов является этот самый "мультикаст". А так да, все в одном процессе. Не знаю является ли эта очередь сообщений аналогичной просто виндовс сообщениям, но ведь гарантии 100% доставки там нету вроде как. Хотя может чушь несу? Механизм для меня новый, много не изведанного... |
26.07.2012, 18:13 | #4 |
Регистрация: 14.08.2008
Сообщений: 8
|
Может чего-то не понимаю, но мне кажется, что то, что я хочу выражается вот такой схемой:
Только я не уверен, что эта схема будет гарантировать строго последовательную передачу данных для случая, о котором я писал в первом посте(разная скорость обработки. Но только я так понял, в моем случае все потоки, содержащие код класса из длл будут серверами(Read Only) судя по примерам с гугла. //-------------- К картинке был такой комментарий: "Для создания почтового ящика и получения дескриптора, который можно будет использовать в операциях ReadFile, почтовые серверы (программы считывания) вызывают функцию CreateMailslot. На одном компьютере может находиться только один почтовый ящик с данным именем, но один и тот же почтовый ящик может использоваться несколькими системами в сети, что обеспечивает возможность работы с ним нескольких программ считывания. " А на схеме нарисовано, что сервер пишет, а клиенты читают. И в интернете много где пишут, что сервер по сути читалка сообщений клиентов, а не массовый рассылатель. ------------------------ Уловил суть. Читать можно по хендлу, отдаваемому созданием слота. Для записи надо получать дескриптор файла. Последний раз редактировалось ShadowMaster; 26.07.2012 в 23:09. |
27.07.2012, 17:49 | #5 |
Регистрация: 14.08.2008
Сообщений: 8
|
Ну где же все гуру межпроцессного взаимодействия? Неужели никто не скажет, чем плохи мейл слоты и тп? Хотя бы подскажите, будет ли при использовании мейл слотов гарантироваться, что каждый читающий поток, прочитает все не прочитанные именно им сообщения? Т.е. был 1 мейл слот и 2 читающих потока. Но читающих с разной скоростью. Вот пришла 1, оба потока взяли ее, а потом первый поток закончил раньше и взял следующее число из слота. Но вот закончил второй поток. Какое число ему будет видно? Как из слота удаляются сообщения? Сами? Какой-то механизм, удаляющий их по факту прочтения? Я так понял этот файл имеет всегда нулевой вес. Значит они работают типо Ram диска в *nix? А если мы явно не удаляем сообщения, они не начнут сжирать всю память? В msdn как-то не очевидно для меня написано. Навигация происходит через функцию получения информации о слоте, хендлы вроде разные и вроде должны указывать на разные слоты(как в системе с сокетами(виртуальные каналы для каждого клиента)), но на деле файл-то одинаковый. Не получится ли так, что они будут видеть одну и туже очередь и GetslotInfo будет возвращать в параметрах не верные значения, если другой поток уже дергал ее? Ну там не тот некст мессадж или не тот некст мессадж сайз.... Подскажите пожалуйста.
|
27.07.2012, 20:34 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Нет, mailslot не гарантирует доставку сообщенией, и даже не уверен насчет очередности. Mailslot весьма похож на UDP. Я не понял, чем не нравится вариант с named pipe? Один получает данные а потом раскидывает "подписавшимся" клиентам по трубе - чем не нравится?.
|
27.07.2012, 22:36 | #7 |
Регистрация: 14.08.2008
Сообщений: 8
|
Видимо просто не пониманием сути.) Мне все всем нравится, я описал задачи, которые мне нужны. Мне как-то не попадалось, чтобы писали про рассылку нескольким клиентам через именованный канал. Видел, что используется для схем 1-1, а для 1-2,1-3, 1-n не видел. Может быть плохо искал. Если не сложно, глянуть бы пример кода с нейм пайп где аналогичные задачи решаются... Я ж потому и прошу помощи на форуме, что ввиду нехватки знаний в области не могу самостоятельно определить, что мне нравится, а что нет.
PS Человек, который не знает, гуглит, выясняет, а как же сделать так, чтобы не изобретать велосипед. И естественно находит в инете картинку со схемой(которую я и привел). Так как раз мой случай. И тут оказывается, что нет гарантии очередности(хотя тут я не понимаю этого, ведь есть все параметры для прохода по слоту в поиске сообщений произвольной длины. А постятся они туда последовательно...) Вот я и пишу на форум, чтобы помогли разобраться.=) Последний раз редактировалось ShadowMaster; 27.07.2012 в 22:46. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Правда ли что 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 |