Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Сергей_С   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.045 c
15-1154067344
pic
2006-07-28 10:15
2006.08.27
какова стоимость...


2-1155038450
nickmas
2006-08-08 16:00
2006.08.27
Получить Y по графику


2-1154771914
Ильдар
2006-08-05 13:58
2006.08.27
Обучение DerectX


15-1154318044
Ююзер
2006-07-31 07:54
2006.08.27
Почему нет меню в дельфийских программах?


3-1150881358
vantage-10
2006-06-21 13:15
2006.08.27
При отсутствии полей замена нулевыми значениями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский