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

Вниз

Межпроцессное взаимодействие, проблемы оптимизиции   Найти похожие ветки 

 
kaZaNoVa ©   (2005-01-12 14:50) [0]

Как лучше, производительнее и оптимальнее реализовывать передачу данных от одного процесса к другому?

Условия - выпоняются на одном компьютере, система Windows XP и выше.

И кто какие предпочитает/юзает ))))

Просьба, по возможности, описывать преимущества и недостатки каждого =)


 
VMcL ©   (2005-01-12 15:04) [1]

>>kaZaNoVa ©  (12.01.05 14:50)

WM_COPYDATA
SendMessage
PostMessage
MMF
...

"преимущества и недостатки каждого" зависят от конкретной задачи.


 
Fay ©   (2005-01-12 15:17) [2]

pipes


 
kaZaNoVa ©   (2005-01-12 15:28) [3]

VMcL ©   (12.01.05 15:04) [1]
а если локально сокеты заюзать, это будет нормально, или неоптимально?


 
Игорь Шевченко ©   (2005-01-12 15:31) [4]


> Как лучше, производительнее и оптимальнее реализовывать
> передачу данных от одного процесса к другому?


LPC


 
Eraser ©   (2005-01-12 15:51) [5]

kaZaNoVa
а если локально сокеты заюзать, это будет нормально, или неоптимально?

Это предпочтительно, потому что, поверь, раз тебе нужно чтобы программы взаимодействовали внутри одного компа, тебе вскором времени понадобится взаимодействие с другими компами. Используя сокеты тебе надо будет просто поменять IP адрес с 127.0.0.1 на какой тебя интересует и всё- твоё приложение полностью сетевое.


 
kaZaNoVa ©   (2005-01-12 15:55) [6]

Eraser ©   (12.01.05 15:51) [5]
точно !!
//я тоже так раз подумал, что с ними можно будет легко разнести программы =)))

Игорь Шевченко ©   (12.01.05 15:31) [4]

> LPC

а это что такое?


 
Kerk ©   (2005-01-12 15:59) [7]

kaZaNoVa ©   (12.01.05 15:55) [6]
> LPC

а это что такое?

Local Procedure Call


 
kaZaNoVa ©   (2005-01-12 16:16) [8]

Kerk ©   (12.01.05 15:59) [7]
а как их юзать?


 
Маг Похмеляйнен   (2005-01-12 16:19) [9]

>производительнее
именованный file mapping + 2 event-a для синхронизации (event "захватил" + event "изменил").
>оптимальнее
зависит от требований разработчика. Что передаётся, как часто, максимально допустимое время реакции и т.д.


 
Piter ©   (2005-01-12 16:47) [10]

kaZaNoVa ©   (12.01.05 15:28) [3]
а если локально сокеты заюзать, это будет нормально, или неоптимально?


это будет очень не оптимально, не говоря уже о том, что TCP/IP протокол установлен не везде


 
Игорь Шевченко ©   (2005-01-12 16:49) [11]


> а как их юзать?


Как обычно


 
Arm79 ©   (2005-01-12 17:51) [12]

Eraser ©   (12.01.05 15:51) [5]

Как вариант, MSMQ. Можно писать и читать из очередей.


 
Sumor   (2005-01-12 21:44) [13]

Всё таки предпочитаю Pipe.
1. Они работают как на локальной машине, так и в сети.
2. работа с нии, почти как с файлами, поддержка security, встроенная функция ожидания информации (WaitForSingleObject). Возможность работы с формализованными сообщениями.


 
Eraser ©   (2005-01-12 22:14) [14]

Sumor
Истина где-то рядом )) или Pipe или сокеты.
Кстати, Sumor, если у тебя есть хорошие ссылочки на инфу по Pipe"ам скинь на мне на мыло, буду очень благодарен! Давно хочу разобраться в этой теме.


 
Игорь Шевченко ©   (2005-01-12 22:59) [15]

Eraser ©   (12.01.05 22:14) [14]

На этом сайте в разделе "Статьи" "Что такое Named Pipes и как с ними бороться"


 
Eraser ©   (2005-01-12 23:05) [16]

Игорь Шевченко
Спасибо!


 
naum   (2005-01-12 23:17) [17]

Мое мнение: 1. Сокеты. Хм. Ну представьте, что ваше приложение стоит на машине с брандмауэром, причем оно само не имеет НИКАКОГО отношения к Интернету... Запускаете вы один из "модулей" и видите страшную таблу (for ex. WinXP SP2) с default-выделенной кнопкой БЛОКИРОВАТЬ. У просто, бедного юзера, читающего заявления мелкомягких про попытку бла-бла открыть порт, начинает заползать мысля, что ваше приложение действительно чего не доброе затеяло... Вообщем для широкого распространения вариант просто отпадает!; 2. pipe - ну мало я с этой штукой работал, хотелось бы побольше инфы, по возможности с примерами; 3. MailSlot - намучился я с ним(и)... Есть много минусов, впрочем как и у задумки про FileMapping (одно и тоже по идеи, но автор коммента про FM не упомянул MailSlot"ы); 4. OLE, а еще лучше DDE... Хм. Так и не разобрался, как через DDE делать обмен сообщениями, опять же, у кого есть инфа/примеры - плиз на мыло!; 5. WM_COPYDATA - пока что остановился именно на нем, по многим причинам, не всегда от меня зависящим - посмотрим как пойдет дальше, хотя сам вариант мне не особо нравится... А вообще вопрос подняли интересный :) Сенькс всем за комменты...


 
Eraser ©   (2005-01-12 23:41) [18]

Ну представьте, что ваше приложение стоит на машине с брандмауэром
На сколько я знаю файрволлы обычно не блокируют соединения на 127.0.0.1. Хотя замечание хорошее, стоит задуматься...


 
kaZaNoVa ©   (2005-01-13 00:31) [19]

naum   (12.01.05 23:17) [17]

> Ну представьте, что ваше приложение стоит на машине с
> брандмауэром, причем оно само не имеет НИКАКОГО
> отношения к Интернету... Запускаете вы один из
> "модулей" и видите страшную таблу (for ex. WinXP SP2)
> с default-выделенной кнопкой БЛОКИРОВАТЬ

да, непредвиденная ситуация ..
точно, глючи обеспечены ..

Sumor   (12.01.05 21:44) [13]

>Всё таки предпочитаю Pipe.
> 1. Они работают как на локальной машине, так и в сети.

сокеты тоже :))
а как Pipe по сети работают?
- svchost.exe как обычно коннектится на 135 порт?

- имхо это небезопасно, лучше делать тогда уж сокеты ...


 
kaZaNoVa ©   (2005-01-13 00:32) [20]

Eraser ©   (12.01.05 23:41) [18]
у меня Oupost 2,1,303 не блокирует, пока я в нете, когда отключён, он что-то блокирует .. приходится отключать если что ....


 
Игорь Шевченко ©   (2005-01-13 00:51) [21]

Мое мнение: Program Files\Borland\Delphi\Demos\IPCDemos\*.*

Уважаемые авторы вопросов - прочитайте, пожалуйста, тексты примеров из каталога Demos, можно несколько раз, все-таки Фрэнк Борланд старался, писал их для вас.


 
Digitman ©   (2005-01-13 10:46) [22]


> мало я с этой штукой работал, хотелось бы побольше инфы,
> по возможности с примерами


всевозможные примеры на эту тему есть в MSDN, правда с-шные


 
naum   (2005-01-13 13:31) [23]

Так... Причем тут 127.0.0.1?! Если firewall реагирует на само открытие порта, причем ему по барабану все остальное :( IPCDemos надо будет глянуть обязательно. Раньше не натыкался на него. Все-таки по поводу DDE - кто-нибудь делал? И еще... Находил кто-нибудь какие-нибудь косяки/минусы в методе через WM_COPYDATA?


 
Alex Konshin ©   (2005-01-13 13:40) [24]

По NamedPipe у меня есть пример "MS SQL Alerter".


 
BlackTr   (2005-01-13 15:25) [25]


> Если firewall реагирует на само открытие порта, причем ему
> по барабану все остально

Нормальный firewall реагирует на пакеты...


 
BlackTr   (2005-01-13 15:27) [26]

А на те пакеты которые блуждают внутри машины (127.0.0.1), ему глубоко начхать


 
naum   (2005-01-13 20:47) [27]

> BlackTr
Пакеты пакетами, но попробуйте. У меня просто есть наглядный пример двухзвенки с использованием sockets - 100пудовое срабатывание брандмауэра WinXP SP2. Нормальный файерволл всегда пасет открытые порты, даже при условии, что ничего через них не гоняется!

>Alex Konshin
А можно его в "студию"?


 
Sumor   (2005-01-13 23:45) [28]

Я писал и DDE, и сокеты, и pipe, и mailslot
Всё зависит от конкретной задачи.
DDE:
простейший вариант: на сервер кидаем TDdeServConv. Заполняем Name - это будет Topic. Дальше обработчик ExecuteMacro будет получать от нас сообщения.
На клиенте: кидаем TDdeClientConv. Записываем в Service - имя exe-модуля сервера (без расширения), в Topic записываем Name компоненты с сервера. ConnectMode в ddeManual.
Всё. Теперь с клиента:
DDeClientConv1.OpenLink;
DDeClientConv1.ExecuteMacroLines(S, false);
DDeClientConv1.CloseLink;

И содержимое S дойдёт до сервера.

Pipe: Они работают по сети при установленной сети от Майкрософта, при этом это может быть не только IP, но и IPX и NetBEUI. Пайпы не проверял, но сообщения от maillslot дублируются по всем установленным протоколам.
Соответственно сокеты - только IP

Mailslot удобны когда нужна массовая рассылка клиентам и наоборот, когда все клиенты пишут только в один сервер.

FileMapping - клиент и сервер на одной машине

Итог: локальная машина: DDE, Pipe, FileMapping
локальная сеть (скажем так, доверенная) Pipe, MailSlot, Sockets
глобальная сеть, или не доверенная: Sockets или протоколы более высокого уровня, благо в дельфях много компонент на этот счёт


 
Alex Konshin ©   (2005-01-14 00:04) [29]

naum   (13.01.05 20:47) [27]
>Alex Konshin
А можно его в "студию"?

Дык качай, кто не дает? Сайт - в анкете.
http://home.earthlink.net/~akonshin/index.htm


 
naum   (2005-01-14 00:08) [30]

Вот это дал, Mr. SUMOR! Во-первых спасибо за сей пример работы с DDE, хоть принципы понял. По возможности: есть пример с "бОльшим" кол-вом возможностей? Не подумайте, что я программирую методом Copy-Paste :), просто нигде нормальной документации по DDE не видел, а 2х сторонний обмен у меня не выходит. Как переслать данные от сервера к клиенту? Каким боком нужны DdeServerItem, DdeClientItem?  И т.д. и т.п. Буду очень рад небольшому примеру, присланному на мыльце. Особо интересует двусторонний обмен и отлов событий connect / dicsonnect (хотя с ними вроде понятно). Теперь попробую его за вместо извращений с WM_COPYDATA. Во-вторых: по всем остальным пунктам тем или иным макаром согласен :)


 
naum   (2005-01-14 00:11) [31]

> Alex Konshin
Сенькс. На сайте бывал и ранее, просто не заметил наверное тогда... Да и не нужно было ) Сейчас скачаю - посмотрю!


 
Sumor   (2005-01-14 19:10) [32]

Продолжение DDE, раз такое дело...
Если сервер DDE не запущен, то запускается приложение указанное в параметре ServiceApplication и делается попытка соединения ещё раз.
DDEItem нужны как раз для обмена информацией.
На сервер дополнительно кидается DDEServerItem. Указывается DDEServer и Name.
Всё теперь у сервера можно будет спросить или записать информацию, записанную в свойство Text (Lines) этого итема.
Для чтения на клиенте после соединения вызывается метод RequestData("Item1") и получаете свойство Text c серверного DDEItem
Для записи значения с клиента вызывается метод
PokeData("Item1","Привет")
и текст записывается на сервер

Соответствено на сервере просто надо держать заполненный Item c ответом на клиентский вопрос. Itemов может быть много. Есть событие отлавливливающее момент изменения Item (когда клиент его меняет)

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


 
naum   (2005-01-17 23:16) [33]

Большое спасибо ) Есть еще пара вопросиков: требует ли DDE наличие определенных компонентов в системе? Нормально ли работает с Win95?


 
Sumor   (2005-01-18 00:10) [34]

DDE появилось на заре появления Windows, поэтому она присутствует во всех версиях. Более того продукты которые её поддерживали поддерживают и сейчас - например Microsoft Word. Вы можете выполнить любую команду, послав ему DDE:
Service: Winword
Topic: System
DDEClientConv.ExecuteMacro("[FileOpen "c:\doc1.doc"]", false);



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

Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.037 c
1-1108363253
Dmitry_04
2005-02-14 09:40
2005.02.27
Check в MainMenu и в PopupMenu


14-1107772094
АлексейК
2005-02-07 13:28
2005.02.27
Построение отчетов


1-1108537973
Zhekson
2005-02-16 10:12
2005.02.27
Иконка в StatusBar_e - это реально???


1-1108349796
alena.svt
2005-02-14 05:56
2005.02.27
Code Explorer


14-1107504610
Тульский
2005-02-04 11:10
2005.02.27
Хасавьюрт-2





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский