Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Обмен данными между процессами   Найти похожие ветки 

 
Сергей_С   (2006-07-12 09:19) [0]

Господа, подскажите, каким образом можно обмениваться данными меджу процессами, запущенными одновременно в одной ОС. Какой-нибудь простой и стабильный способ.

Варианты через файловую систему, DDE, OLE, COM - просьба не рассматривать.

Данные имеют бинарный формат.

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


 
Сергей М. ©   (2006-07-12 09:34) [1]

см. WM_COPYDATA


 
Юрий Зотов ©   (2006-07-12 10:15) [2]

Еще вариант - CreateFileMapping.


 
Сергей М. ©   (2006-07-12 10:16) [3]

Еще вариант - NamedPipes.


 
han_malign ©   (2006-07-12 10:38) [4]

Socket, MailSlot, семафоры и мутанты


 
GrayFace ©   (2006-07-12 14:15) [5]

А еще Event"ы


 
Юрий Зотов ©   (2006-07-12 15:00) [6]

Эта... мож, я че не понимаю, но какое отношение семафоры, мутанты (мьютексы?) и Event"ы имеют к обмену данными между процессами?


 
DrPass ©   (2006-07-12 15:17) [7]


> какое отношение семафоры, мутанты (мьютексы?) и Event"ы
> имеют к обмену данными между процессами?

Ну, один процесс может чего-нибудь написать в файл и установить... мм...мутанта :D. Второй - определить наличие мутанта и после этого считать из файла. Чем не обмен? :)))


 
Rial ©   (2006-07-12 15:39) [8]


> Юрий Зотов ©   (12.07.06 15:00) [6]
>
> Эта... мож, я че не понимаю, но какое отношение семафоры,
>  мутанты (мьютексы?) и Event"ы имеют к обмену данными между
> процессами?


А что в этом такого ?
У меня как то 2 приложения Event-ами 2 МБ данных передавали друг другу...

Правда, с остальными 2-мя сложнее уже.


 
Игорь Шевченко ©   (2006-07-12 15:47) [9]


> но какое отношение семафоры, мутанты (мьютексы?) и Event"ы
> имеют к обмену данными между процессами?


Косвенное


 
Медвед   (2006-07-12 15:48) [10]

>Rial ©   (12.07.06 15:39) [8]
>У меня как то 2 приложения Event-ами 2 МБ данных передавали друг другу...
Messagaми ?


 
Сергей М. ©   (2006-07-12 15:49) [11]


> DrPass ©   (12.07.06 15:17) [7]


> DrPass ©   (12.07.06 15:17) [7]


Мьютексы, семафоры и ивенты - не более чем объекты интра/интерпроцессной синхронизации. К интерпроцессному инф.обмену они не имеют отношения.


 
han_malign ©   (2006-07-12 15:51) [12]


> Эта... мож, я че не понимаю

Ну, на трех Event-ах можно организовать "полноценный" бинарный поток. Изврат конечно, но возможность то есть... :)


 
Юрий Зотов ©   (2006-07-12 15:53) [13]

> DrPass ©   (12.07.06 15:17) [7]

К синхронизации передачи данных все это, конечно, относится. А как это относится к самой передаче данных? Никак. А она не обязана быть синхронной, да и вопрос вовсе не о синхронизации.

> Rial ©   (12.07.06 15:39) [8]

HANDLE CreateEvent(
 LPSECURITY_ATTRIBUTES lpEventAttributes,
 BOOL bManualReset,
 BOOL bInitialState,
 LPCTSTR lpName
);

Не понимаю, куда здесь можно запихнуть 2 метра данных. В чем я неправ?


 
DrPass ©   (2006-07-12 15:53) [14]


> Сергей М. ©   (12.07.06 15:49) [11]

Смайлики видел?


 
han_malign ©   (2006-07-12 16:56) [15]


> Не понимаю, куда здесь можно запихнуть 2 метра данных.


while(WaitForSingleObject(hReceiveReadyEvent, INFINITE) = WAIT_OBJECT_0)do begin
      if(...)then SetEvent(hBitStateEvent) else ResetEvent(hBitStateEvent);
      SetEvent(hDataReadyEvent);
end;

SetEvent(hReceiveReadyEvent);
while(WaitForSingleObject(hDataReadyEvent, INFINITE) = WAIT_OBJECT_0)do begin
      if(WaitForSingleObject(hBitStateEvent, 0) = WAIT_OBJECT_0)
      then ...
      else ...;
      SetEvent(hReceiveReadyEvent);
end;

битовый(булевый) поток :)))


 
Чапаев ©   (2006-07-12 17:38) [16]

А почему о именованных каналах никто не вспомнил?


 
Rial ©   (2006-07-12 17:52) [17]


> han_malign ©   (12.07.06 16:56) [15]
>
>
> > Не понимаю, куда здесь можно запихнуть 2 метра данных.
>


Фактически, телепатия.


> Медвед   (12.07.06 15:48) [10]
>
> Messagaми ?


А можно и так. Тут аж по несколько байт передается, в lWaram и wParam!
Можно еще передавать информацию, передавая сообщения с
WM_USER по WM_USER + $100. Еще байтик...

Бред все это, но мне пригождалось.
И скорость у второго способа не такая уж и низкая.

О подводных камнях не буду уж говорить ...


 
DVM ©   (2006-07-12 18:15) [18]


> Какой-нибудь простой и стабильный способ.

ИМХО сокеты самое лучшее. И универсальное.


 
DrPass ©   (2006-07-12 18:19) [19]


> Чапаев ©   (12.07.06 17:38) [16]
> А почему о именованных каналах никто не вспомнил?

Вспомнили еще в третьем посте этой ветки


> DVM ©   (12.07.06 18:15) [18]
>
> > Какой-нибудь простой и стабильный способ.
>
> ИМХО сокеты самое лучшее. И универсальное.

Ты не прав. Интересно, как ты будешь работать через сокеты, если на машине нет TCP/IP? Уж лучше по нуль-модему :)


 
han_malign ©   (2006-07-12 18:25) [20]


> если на машине нет TCP/IP

127.0.0.1


 
DVM ©   (2006-07-12 18:30) [21]


> Интересно, как ты будешь работать через сокеты, если на
> машине нет TCP/IP

Трудно найти такую машину. К тому же сокеты это не только TCP/IP и даже IP


 
DrPass ©   (2006-07-12 21:20) [22]


> han_malign ©   (12.07.06 18:25) [20]

И что?

> DVM ©   (12.07.06 18:30) [21]

Да всяко бывает. Видел бы ты, сколько юзеров сидят еще под Win9x... В любом случае, сетевые технологии должны использоваться для сетевых приложений. Гонять данные из одной программы в другую через весь стек сетевых протоколов туда и обратно - плохое занятие, если есть альтернативные 100% работающие и при этом более эффективные и простые технологии.


 
MikProg ©   (2006-07-12 21:25) [23]


> Юрий Зотов ©   (12.07.06 10:15) [2]

Прав однако! :)


 
Leonid Troyanovsky ©   (2006-07-12 22:02) [24]


> han_malign ©   (12.07.06 15:51) [12]

> Ну, на трех Event-ах можно организовать "полноценный" бинарный
> поток. Изврат конечно, но возможность то есть... :)


А, почему, собс-но, не на двух?
Изврат, конечно, но возможность-то есть.

--
Regards, LVT.


 
Сергей_С   (2006-07-13 06:57) [25]

ого, сколько насоветовали :)

Всем спасибо!


 
DVM ©   (2006-07-13 10:09) [26]


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

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


 
GrayFace ©   (2006-07-13 11:38) [27]

Leonid Troyanovsky ©   (12.07.06 22:02) [24]
А, почему, собс-но, не на двух?
Изврат, конечно, но возможность-то есть.

Как?


 
DrPass ©   (2006-07-13 11:49) [28]


> Как ни странно изначально сокеты предназначались вовсе не
> для сетевых приложений

Странно. А для чего, когда, и на какой платформе? И где об этом можно прочитать?


 
Игорь Шевченко ©   (2006-07-13 12:18) [29]


> А для чего, когда, и на какой платформе?


Для межпроцессного взаимодействия, на платформе unix


 
Evgeny V ©   (2006-07-13 13:21) [30]


> GrayFace ©   (13.07.06 11:38) [27]


Изврат конечно - но можно, именованные события - одно для сигнала о том, что данные установлены, а второе собственно бит данных - но изврат.
Второй вариант, более корректный на мой взгляд, но тоже изврат, те же события - взвод одного означает бит 0, другого бит 1.  
LOL
Не думаю, что возникнет необходимость пользоваться такими способами...


 
GrayFace ©   (2006-07-13 14:01) [31]

Нет, смотри как с 3:
E1 - принимающий принял данные
E2 - бит данных = 0
E3 - бит данных = 1

0) Все E = 0
1) Принимающий:
for i:=1 to размер do
  E1 = 1
  Wait for E2 или E3
  В зависимости от результата ожидания ставит очередной бит

2) Отправляющий:
for i:=1 to размер do
  E1 = 0
  E2 или E3 = 1 в зависимости от бита данных
  Wait for E1
3) goto 1)

Как обойтись без E1?


 
GrayFace ©   (2006-07-13 14:04) [32]

0) и 3) - это я забыл убрать.


 
Сергей_С   (2006-07-13 14:30) [33]

Господа, тысячу извинений, что прерываю жаркую дискуссию.

Выбрал вариант с использованием CreateFileMapping.

С закладкой данных проблем не возникло.
Возникли непонятки с извлечением:

FpoBaseAddress := MapViewOfFile(FhFileMapObj, FILE_MAP_WRITE, 0, 0, 0);

После вызова этой функции я получаю указатель на начальный адрес данных объекта файлового отображения.
Но, скажите мне, что мне дальше делать с этим указателем? Если бы я знал размер блока, который там лежит, то все понятно. Но я его не знаю! Получаю только адрес. Данные бинарные, поэтому никакие stValue := PChar(FpoBaseAddress) - не подойдут.
Или я что-то неправильно понимаю?


 
Игорь Шевченко ©   (2006-07-13 14:48) [34]


> Если бы я знал размер блока, который там лежит, то все понятно.
>  Но я его не знаю! Получаю только адрес


А в первые два(четыре) байта положить размер блока ?


 
Evgeny V ©   (2006-07-13 14:51) [35]


> GrayFace ©   (13.07.06 14:01) [31]


Посигналь обратно неустановленным Event (по твоему примеру один из E2 или Е3), отправляющий знает какой это эвент и будет ждать его, как синхронизацию. Вообще это не метод на мой взгляд, ни с двумя ни с тремя ...так что лучше стандртными способами воспользоваться.


> Сергей_С   (13.07.06 14:30) [33]

Пример есть для дельфи 6 в директории DEMOS в IPCDEMOS.


 
Сергей_С   (2006-07-13 15:01) [36]

2Игорь Шевченко ©   (13.07.06 14:48) [34]
А в первые два(четыре) байта положить размер блока ?

Положить не проблема.
Другого способа нет что-ли?


 
Игорь Шевченко ©   (2006-07-13 15:06) [37]


> Другого способа нет что-ли?


Есть. http://www.delphimaster.ru/articles/named_pipes/index.html


 
Сергей_С   (2006-07-13 15:08) [38]

2 Игорь Шевченко ©   (13.07.06 15:06) [37]

Я имел в виду другой способ определения размера буфера, без его передачи вместе с буфером :). Не уходя от использования FileMapping.


 
Игорь Шевченко ©   (2006-07-13 15:11) [39]

Сергей_С   (13.07.06 15:08) [38]


> Я имел в виду другой способ определения размера буфера,
> без его передачи вместе с буфером :). Не уходя от использования
> FileMapping.


Нету. FileMapping - это просто кусок памяти. А сколько туда положено, знает только положивший на момент положения и если он никому об этом явно не скажет, то размер положенного останется тайной.


 
Сергей_С   (2006-07-13 15:13) [40]

2 Игорь Шевченко ©   (13.07.06 15:11) [39]

ясно



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.032 c
2-1154633667
Mr tray
2006-08-03 23:34
2006.08.27
рисование на канвасе TImage


2-1155004047
vladimirg88
2006-08-08 06:27
2006.08.27
печать координат


4-1146775675
<X>
2006-05-05 00:47
2006.08.27
Работа со шрифтами средствами WinApi


2-1154787406
Reaktor
2006-08-05 18:16
2006.08.27
Как изменить цвет объекта Button?


15-1154088626
test'er
2006-07-28 16:10
2006.08.27
Помогите с кодом