Форум: "Основная";
Текущий архив: 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