Сейчас на форуме: _MBK_, UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Передача данных между локальными процессами |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 15 июля 2011 14:15 · Личное сообщение · #1 Задача: передавать небольшие порции данных между процессами; после передачи данные должны удаляться, чтобы не занимать память. Вопросы: использовать mailslot или pipe? есть ли различия, если не считать одно- и двух- направленность? с обоими надо использовать события? У Рихтера ни про одно ни про другое толком не написано( Несколько часов рылся в интернете - ни как не могу определиться) З.Ы. Использовать файлы не вижу смысла, данные небольшие, да и копить их смысла нет. З.Ы.Ы. или почта и пайп тоже накапливают данные? |
|
Создано: 15 июля 2011 14:53 · Личное сообщение · #2 |
|
Создано: 15 июля 2011 14:54 · Поправил: Av0id · Личное сообщение · #3 |
|
Создано: 15 июля 2011 14:59 · Личное сообщение · #4 |
|
Создано: 15 июля 2011 15:00 · Личное сообщение · #5 |
|
Создано: 15 июля 2011 15:09 · Личное сообщение · #6 |
|
Создано: 15 июля 2011 15:14 · Поправил: Wishmaster-zanyat · Личное сообщение · #7 |
|
Создано: 15 июля 2011 15:17 · Личное сообщение · #8 Никакого. Я хз, откуда у тебя мания с памятью. Если написано прямыми руками, память расти не должна. | Сообщение посчитали полезным: ARCHANGEL |
|
Создано: 15 июля 2011 15:43 · Поправил: Wishmaster-zanyat · Личное сообщение · #9 Ок, опишу по другому: и серверный поток и клиентский будут читать и писать в память; для этого придется приостанавливать клиентский поток, а это не допустимо - клиентский поток не должен простаивать; мне нужно что-то наподобие обычной почты: потоки отправляют сообщения, и забывают про них, соответственно адресат получает сообщение и удаляет его из своей очереди (FIFO). Через что лучше реализовать? Av0id Спасибо за ссылки) я так понял майлслоты лучше пользовать если нужна широковещательная рассылка и сообщения из очереди не удаляются; а про пайпы не сказано про память, и не очень удобно создавать два пайпа; |
|
Создано: 15 июля 2011 16:02 · Личное сообщение · #10 |
|
Создано: 15 июля 2011 16:07 · Личное сообщение · #11 |
|
Создано: 15 июля 2011 16:48 · Личное сообщение · #12 |
|
Создано: 15 июля 2011 16:50 · Личное сообщение · #13 можно еще такой вариант рассмотреть http://www.rsdn.ru/article/baseserv/ipc.xml Библиотеки динамической компоновки (DLL) Библиотеки динамической компоновки также имеют способность обеспечивать обмен данными между процессами. Когда в рамках DLL объявляется переменная, ее можно сделать разделяемой (shared). Все процессы, обращающиеся к библиотеке, для таких переменных будут использовать одно и то же место в физической памяти. (Здесь также важно не забыть о синхронизации.) |
|
Создано: 15 июля 2011 17:04 · Личное сообщение · #14 |
|
Создано: 15 июля 2011 17:22 · Поправил: reversecode · Личное сообщение · #15 с сокетами данные нужно в пределах какого то времени забрать, иначе они удалятся(насколько я помню) а если и не удалятся то будет определенное ограничение на буффер через сокеты а судя по вашим комментариям в теме вы их хотите получать(и отправлять) тогда когда хотите, конечно евент на событие что данные в сокете есть и их нужно забрать - может спасти но не зная вашей архитектуры и растущий своп, могу предположить что забираете вы их именно когда хотите тогда все же лучше реализовать свой FIFO через DLL с синхронизациями |
|
Создано: 16 июля 2011 14:41 · Личное сообщение · #16 Почему нельзя так: 1. Используется файловый меппинг. Процесс, который формирует передаваемую инфу, выделяет память. 2. Второй процесс проверяет общую с первым проекцию. Как только данны обработаны и больше не нужны - QueueUserAPC передаёт инфу в поток первого процесса. 3. Вызывается апцшный CALLBACK, который освобождает память и всё повторяется. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 16 июля 2011 23:18 · Личное сообщение · #17 ARCHANGEL Мелкие не рекомендуют пользовать APC между процессами: Note Queueing APCs to threads outside the caller's process is not recommended for a number of reasons. DLL rebasing can cause the addresses of functions used by the APC to be incorrect when the functions are executed outside the caller's process. Similarly, if a 64-bit process queues an APC to a 32-bit process or vice versa, addresses will be incorrect and the application will crash. Other factors can prevent successful function execution, even if the address is known. У меня есть одна идея... если получится на днях отпишусь |
|
Создано: 30 июля 2011 21:18 · Личное сообщение · #18 |
|
Создано: 30 июля 2011 23:58 · Личное сообщение · #19 |
|
Создано: 01 августа 2011 04:11 · Личное сообщение · #20 |
|
Создано: 05 августа 2011 11:56 · Личное сообщение · #21 Доброго времени суток Пара примеров для пересылки данных между приложениями в аттаче. ну и в теме вопрос Code:
(исходник в папке WM_Msg_All_Data в аттаче) указатель отправляю через SendMessage, на др приложении принимаю, но вот проблема не верно определяется тип данных. Пж поправте мою ошику. Заранее спасибо. 2b06_05.08.2011_EXELAB.rU.tgz - 0000.rar |
|
Создано: 05 августа 2011 15:53 · Личное сообщение · #22 |
|
Создано: 05 августа 2011 16:13 · Личное сообщение · #23 |
|
Создано: 06 августа 2011 01:44 · Личное сообщение · #24 |
|
Создано: 06 августа 2011 02:44 · Личное сообщение · #25 А кто сказал, что вторая софтина моя? Я в ней сообщения окна не обрабатываю и не собираюсь, мне оно не надо. У меня другой вопрос по сокетам (дабы не плодить тем продолжу эту). Как говорится лучшее враг хорошего... вот и наоптимизировался) Есть блокирующий сокет. В OnReceive пришло сразу 2 пакета по шесть байт (первый байт длинна пакета): 06 01 02 03 04 05 06 01 02 03 04 05. Если я прочитаю только первые шесть байт и выйду из обработчика вызовется ли он сразу (ну или почти сразу) ещё раз и останется ли в сокете второй пакет? |
|
Создано: 06 августа 2011 17:31 · Личное сообщение · #26 Wishmaster-zanyat пишет: и останется ли в сокете второй пакет? o_O Вот за что осуждаю программистов, начинающих писать на дельфи, С++ Билдере, .NET, MFC - подход к объектам ОС не то чтобы неверен, а просто ну совершенно исключается понятие такое на первых этапах обучения. В результате чего новичок хватает класс, хватает второй - что-то получается, хм... Но абсолютное непонимание событийной модели + инкапсуляция приводит вот к таким вопросам. Инкапсуляция, наследование в ООП заставляет людей долго мучаться болезнями... Что имел в виду ТС? Под сокетом, разумеется - CSocket - MFC-класс, инкапсулирующий в себя весь функционал сокетов. Но извините, называть его для упрощения сокетом неправильно - в сложных предложениях получается полный бред! Что из себя представляет OnReceive? OnReceive - метод-обработчик "события" "Вам пакет" В винде такого события нет ))) На самом деле вызывается обработчик после достигнутого результата одной из функций ожидания (listen, accept, WSAGetOverlappedResult...), с WM_сообщениями ничего общего... Причём в аргументах ф-ции OnReceive содержится только код ошибки, 0 - всё ок. Читать надо Receive - про это автор знает - Wishmaster-zanyat пишет: Если я прочитаю только первые шесть байт Ну, метод Receive аналогичен функции винсока recv(), или нет? Читаем: If no error occurs, Receive returns the number of bytes received. Но до этого автор пишет: Wishmaster-zanyat пишет: В OnReceive пришло сразу 2 пакета по шесть байт Откуда Вам это, ещё до вызова Receive, уже известно? ))) Исключая ясновидение и др. аномалии, Вы уже сами ответили на свой вопрос: всё, что пришло - уже в буфере. Если выйдете из обработчика, то всё зависит где у Вас выделен буфер. Если локально - то да, всё потеряете... брр.... устал... ----- IZ.RU |
|
Создано: 06 августа 2011 17:48 · Поправил: reversecode · Личное сообщение · #27 Wishmaster-zanyat реализации CSocket не знаю но если брать recv/recvfrom то в реализации udp recvfrom возращает сразу весь пакет, желательно конечно контроллировать его в res а вот в реализации tcp, recv желательно делать в цикле пока res не вернет 0/ошибку, и все данные которые вернет recv добавлять до уже пришедших |
|
Создано: 06 августа 2011 17:49 · Поправил: PE_Kill · Личное сообщение · #28 DenCoder пишет: В винде такого события нет А как же WSA API для асинхронных сокетов? reversecode пишет: recv желательно делать в цикле пока res не вернет ошибку Пока не вернет 0. Т.к. ошибка при keep alive соединении будет только после тайм аута. (О, уже исправился) ----- Yann Tiersen best and do not fuck |
|
Создано: 06 августа 2011 18:04 · Личное сообщение · #29 |
|
Создано: 07 августа 2011 11:51 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Передача данных между локальными процессами |
Эта тема закрыта. Ответы больше не принимаются. |