Сейчас на форуме: _MBK_, UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Передача данных между локальными процессами
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 14:15
· Личное сообщение · #1

Задача:
передавать небольшие порции данных между процессами;
после передачи данные должны удаляться, чтобы не занимать память.

Вопросы:
использовать mailslot или pipe?
есть ли различия, если не считать одно- и двух- направленность?
с обоими надо использовать события?

У Рихтера ни про одно ни про другое толком не написано(
Несколько часов рылся в интернете - ни как не могу определиться)

З.Ы. Использовать файлы не вижу смысла, данные небольшие, да и копить их смысла нет.
З.Ы.Ы. или почта и пайп тоже накапливают данные?



Ранг: 2.6 (гость), 4thx
Активность: 0=0
Статус: Участник

Создано: 15 июля 2011 14:53
· Личное сообщение · #2

Если не хочешь использовать файлы, почему бы не сделать обмен сообщений между процессами? или использование проекции файла?



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 15 июля 2011 14:54 · Поправил: Av0id
· Личное сообщение · #3

я бы pipe заюзал, а вы как хотите

http://msdn.microsoft.com/en-us/library/aa365780%28v=VS.85%29.aspx

и вот тут описаны плюсы и минусы

http://msdn.microsoft.com/en-us/library/aa365574%28v=VS.85%29.aspx



Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 14:59
· Личное сообщение · #4

Когда я писал про файлы - я и имел ввиду проекции.

почта и(или) пайп данные накапливают или при приёме их можно удалять?




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 15 июля 2011 15:00
· Личное сообщение · #5

AnTiDoD пишет:
использование проекции файла?


+1




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 15 июля 2011 15:09
· Личное сообщение · #6

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

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 15:14 · Поправил: Wishmaster-zanyat
· Личное сообщение · #7

Если делать через файл, и процессы обмениваются каждую секунду по 10-200 байт, и софтина работает не выключаясь месяц, два, три, какого размера нужен своп?

В среднем получается 500 метров, максимум гектар в месяц. А если данных больше будет...




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 15 июля 2011 15:17
· Личное сообщение · #8

Никакого. Я хз, откуда у тебя мания с памятью. Если написано прямыми руками, память расти не должна.

| Сообщение посчитали полезным: ARCHANGEL

Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 15:43 · Поправил: Wishmaster-zanyat
· Личное сообщение · #9

Ок, опишу по другому:
и серверный поток и клиентский будут читать и писать в память;
для этого придется приостанавливать клиентский поток, а это не допустимо - клиентский поток не должен простаивать;
мне нужно что-то наподобие обычной почты: потоки отправляют сообщения, и забывают про них, соответственно адресат получает сообщение и удаляет его из своей очереди (FIFO).

Через что лучше реализовать?

Av0id
Спасибо за ссылки)
я так понял майлслоты лучше пользовать если нужна широковещательная рассылка и сообщения из очереди не удаляются;
а про пайпы не сказано про память, и не очень удобно создавать два пайпа;




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 15 июля 2011 16:02
· Личное сообщение · #10

Без изобретений велосипедов - Mailslot, Pipe, Socket.

-----
Следуй за белым кроликом




Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 16:07
· Личное сообщение · #11

neomant пишет:
Без изобретений велосипедов - Mailslot, Pipe, Socket.

Что это? я же спрашивал: использовать mailslot или pipe?

К тому же в примерах мсдн пайп получается двунаправленный, в один пайп можно и писать и читать из него...

Я закипел, пойду пройдусь, хорошая мысля приходит опосля...



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 15 июля 2011 16:48
· Личное сообщение · #12

ну тогда может сокеты?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 15 июля 2011 16:50
· Личное сообщение · #13

можно еще такой вариант рассмотреть

http://www.rsdn.ru/article/baseserv/ipc.xml
Библиотеки динамической компоновки (DLL)
Библиотеки динамической компоновки также имеют способность обеспечивать обмен данными между процессами. Когда в рамках DLL объявляется переменная, ее можно сделать разделяемой (shared). Все процессы, обращающиеся к библиотеке, для таких переменных будут использовать одно и то же место в физической памяти. (Здесь также важно не забыть о синхронизации.)




Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 июля 2011 17:04
· Личное сообщение · #14

надо без синхронизации...

Av0id пишет:
ну тогда может сокеты?

может. мне тоже такая мысль пришла, надо ещё подумать... до завтра... утро вечера мудренее)




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 15 июля 2011 17:22 · Поправил: reversecode
· Личное сообщение · #15

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 16 июля 2011 14:41
· Личное сообщение · #16

Почему нельзя так:
1. Используется файловый меппинг. Процесс, который формирует передаваемую инфу, выделяет память.
2. Второй процесс проверяет общую с первым проекцию. Как только данны обработаны и больше не нужны - QueueUserAPC передаёт инфу в поток первого процесса.
3. Вызывается апцшный CALLBACK, который освобождает память и всё повторяется.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 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.

У меня есть одна идея... если получится на днях отпишусь



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 30 июля 2011 21:18
· Личное сообщение · #18

Wishmaster-zanyat пишет:
Ок, опишу по другому:и серверный поток и клиентский будут читать и писать в память;для этого придется приостанавливать клиентский поток, а это не допустимо - клиентский поток не должен простаивать;

Юзай расшареную память и всё

-----
продавец резиновых утёнков





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 30 июля 2011 23:58
· Личное сообщение · #19

Wishmaster-zanyat, по первой части 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. можно всё грамотно просчитать и составить корректный код.

-----
IZ.RU




Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 01 августа 2011 04:11
· Личное сообщение · #20

Не буду тянуть кота...
Я кроме пользы немного поигрался, если можно так сказать , и сделал проксю, через которую идёт весь трафик проги, а заодно и... мои сообщения.
Никогда этим не занимался, с инетом косяки, времени почти нет, но было весело)



Ранг: 16.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 августа 2011 11:56
· Личное сообщение · #21

Доброго времени суток

Пара примеров для пересылки данных между приложениями в аттаче.

ну и в теме вопрос
Code:
  1. //отправка указателя на массив + величина массива 
  2. Procedure SendMsg(aData: Array Of Const);
  3. begin
  4. { SendArrayConst ([Application.MainForm.Handle, 'Тест', Application,
  5.     'Dll: ', False, 'Сообщение',  $00000001])
  6.    Else
  7.     SendArrayConst ([HInstance, 'Тест', Application,
  8.     'Dll: ', False, 'Сообщение',  Dll_Process_Detach]);}
  9.   SendMessage (HWnd_Broadcast, WM_Msg, Integer (Pointer (@aData)), SizeOf (aData))//;
  10. end;
  11.  
  12. Var
  13.   BackReciveProc: Procedure (X: array of Const) of object = Nil;
  14.  
  15. //получение сообщения с указ на массив
  16. function TMsgForApp.Hook(var Msg: TMessage): Boolean;
  17. Var
  18.   TVR: TVarArray;
  19.   I, Hand: Integer;
  20. begin
  21.   Result := False;
  22.   If MSG.Msg = WM_MSG Then //приняли зарег. сообщение
  23.   Begin
  24.     //CopyMemory (@X, Pointer (Msg.WParam), Msg.LParam); //берем указатель на массив и копируем его
  25.     CopyMemory (@TVR, Pointer (Msg.WParam), Msg.LParam); //берем указатель на массив и копируем его
  26.     //****************************************************
  27.     //Исправить получение данных
  28.     //****************************************************
  29.     For I := 0 To High (TVR) Do
  30.     with TVarRec(TVR[0]) do
  31.     case VType of
  32.       vtInteger: Hand := vtInteger;
  33.     End;
  34.     If Application.MainForm = Nil Then//если главной формы нету (например DLL)
  35.     Begin
  36.       //рабетаем с массивом в библиотеке, например, принимаем вызов на снятие хука
  37.       //должно верно работать при глобальных хуках
  38.       If Hand <> HInstance Then
  39.       Begin
  40.         //если из другой библы
  41.       End
  42.        Else
  43.       Begin
  44.         //текущей библы
  45.       End;
  46.     End
  47.      Else
  48.     //приложения, например получаем хендл откуда было отправлено сообщение,
  49.     //и строку сообщения
  50.     If @BackReciveProc <> Nil Then //если указана процедура для принятия сообщений
  51.     If Hand <> Application.MainForm.Handle Then
  52.       BackReciveProc (TVR);// работаем с массивом для
  53.   End;
  54. end;
  55.  
  56.  
  57.   USendMsg.BackReciveProc := RecData;
  58.  
  59.  
  60. procedure RecData(ReciveData: array of const);
  61. var
  62.   i: Integer;
  63. begin
  64.   ShowMessage ('');
  65.   for I := Low(ReciveData) to High(ReciveData) do
  66.     with ReciveData[I] do
  67.       case VType of
  68.         vtExtended:
  69.           begin
  70.             { добавляем натуральное число, все real-форматы
  71.             автоматически приводятся к extended }
  72.           end;
  73.         vtInteger:
  74.         begin          
  75.             { добавляем целое число, все integer-форматы
  76.             автоматически приводятся к LongInt }
  77.           end;
  78.         vtPChar: ShowMessage('PChar:'#9 + StrPas(VPChar));
  79.         vtObject:
  80.           begin
  81. {            if VObject is DArray then
  82.               with DArray(VObject) do
  83.               begin
  84.                 { добавляем массив double-типа }
  85. {              end
  86.             else if VObject is IArray then
  87.               with IArray(VObject) do
  88.               begin
  89.                 { добавляем массив integer-типа }
  90. {              end; }
  91.           end;
  92.       end; { Case }
  93. end;
  94.  
  95. procedure TForm1.Button1Click(Sender: TObject);
  96. begin
  97.   SendMsg ([Application.MainForm.Handle, 'Тест', Application, 'Dll: ', False,
  98.   'Сообщение',  $00000001]);
  99. end;


(исходник в папке WM_Msg_All_Data в аттаче)
указатель отправляю через SendMessage, на др приложении принимаю, но вот проблема не верно определяется тип данных. Пж поправте мою ошику.

Заранее спасибо.



2b06_05.08.2011_EXELAB.rU.tgz - 0000.rar




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 05 августа 2011 15:53
· Личное сообщение · #22

Городишь свой велосипед. В MS уже давно реализовали этот механизм посредством сообщения WM_COPYDATA.

-----
Yann Tiersen best and do not fuck




Ранг: 16.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 августа 2011 16:13
· Личное сообщение · #23

хмм, что то совсем забыл про _CopyData, хотя все таки хотел бы ответ по правильному определению типа данных



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 06 августа 2011 01:44
· Личное сообщение · #24

LPC рулит, остальное не годно.



Ранг: 6.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 06 августа 2011 02:44
· Личное сообщение · #25

А кто сказал, что вторая софтина моя? Я в ней сообщения окна не обрабатываю и не собираюсь, мне оно не надо.

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

Есть блокирующий сокет. В OnReceive пришло сразу 2 пакета по шесть байт (первый байт длинна пакета):
06 01 02 03 04 05 06 01 02 03 04 05. Если я прочитаю только первые шесть байт и выйду из обработчика вызовется ли он сразу (ну или почти сразу) ещё раз и останется ли в сокете второй пакет?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 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





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 августа 2011 17:48 · Поправил: reversecode
· Личное сообщение · #27

Wishmaster-zanyat
реализации CSocket не знаю
но если брать recv/recvfrom
то в реализации udp recvfrom возращает сразу весь пакет, желательно конечно контроллировать его в res
а вот в реализации tcp, recv желательно делать в цикле пока res не вернет 0/ошибку, и все данные которые вернет recv добавлять до уже пришедших




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 06 августа 2011 17:49 · Поправил: PE_Kill
· Личное сообщение · #28

DenCoder пишет:
В винде такого события нет

А как же WSA API для асинхронных сокетов?

reversecode пишет:
recv желательно делать в цикле пока res не вернет ошибку

Пока не вернет 0. Т.к. ошибка при keep alive соединении будет только после тайм аута.
(О, уже исправился)

-----
Yann Tiersen best and do not fuck





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 06 августа 2011 18:04
· Личное сообщение · #29

PE_Kill пишет:
А как же WSA API для асинхронных сокетов?

Забыл упомянуть, есть такое... но так можно любое WM_сообщение создать... Кроме того, привык сетевой функционал(то бишь протокол выше уровнем) в dll выносить, где там хендл гуи-окна?

-----
IZ.RU





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 07 августа 2011 11:51
· Личное сообщение · #30

DenCoder пишет:
где там хендл гуи-окна?


CreateWindowEx(WS_EX_TOOLWINDOW, "SocketClass", "", WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);

Хотя сам я предпочитаю работать только с блокирующими сокетами, там хоть какой то контроль есть над ними.

-----
Yann Tiersen best and do not fuck



. 1 . 2 . >>
 eXeL@B —› Программирование —› Передача данных между локальными процессами
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати