Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » методы обмена данными между процессами

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

ValidolX

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
кто какие знает?
 
 
можно ли открыть ком - порт в одном процессе  
а использовать его в другом (мне так надо!)
и если можно - как передать Handle ?

Всего записей: 1713 | Зарегистр. 22-07-2001 | Отправлено: 18:27 28-01-2003
CruxMortis

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нарыл тут у себя в доках:
 
IPC: основы межпроцессного взаимодействия
Обзор технологий  
 
Введение
Любая операционная система была бы весьма ущербна, если бы замыкала выполняющееся приложение в собственном темном мирке без окон и дверей, без какой-либо возможности сообщить другим программам какую-либо информацию. Если посмотреть внимательно, можно заметить, что далеко не все приложения являются самодостаточными. Очень многим, если не большей части, требуется информация от других приложений, либо они должны эту информацию сообщать. Именно поэтому в операционную систему встраивается множество механизмов, которые обеспечивают т.н. Interproccess Communication (IPC) - то есть межпроцессное взаимодействие.  
 
В историческом плане сначала появилась необходимость в общении процессов, выполняющихся на одном компьютере. В дальнейшем с бурным развитием сетевых технологий все острее стала чувствоваться потребность в средствах для взаимодействия процессов, выполняющихся на разных компьютерах в сети. Особенно трудна такая задача, если это компьютеры на базе разных платформ и/или с разными операционными системами.  
 
Рассмотрим подробнее несколько ключевых примеров, демонстрирующих важность IPC. Вам, возможно это покажется неправдоподобным, но зачатки IPC существовали еще в MS-DOS - и это несмотря на то, что MS-DOS при всем желании трудно назвать многозадачной средой. В самом деле, когда вы в командной строке вводили подобную инструкцию :  
 
C:\>DIR|MORE  
 
происходило следующее: выполнялась команда DIR и ее вывод записывался во временный текстовый файл. После этого содержимое файла подавалось на вход команды MORE. В результате вы получали листинг каталогов, который в случае большого количества каталогов не уезжал мгновенно за экран, а мог скроллироваться с помощью клавиши Enter. Конечно же это очень примитивный IPC, но его наличие показывает, что уже тогда такой механизм был востребован и в какой-то мере реализован.  
 
Примеры использования IPC охватывают гораздо большее количество программ и приложений, чем вы скорее всего думаете. Когда вы выходите в интернет, ваш браузер - одна программа (процесс) - взаимодействует с web-сервером - другой программой (процессом). Эти программы выполняются на разных компьютерах; браузер на вашем, сервер - где-то еще. И вас не волнует, какая ОС установлена на сервере и какая там платформа.  
Или, например, вы работаете с удаленной базой данных. Ваше клиентское приложение - это один процесс, на сервере базы данных запущен другой процесс. Процесс на сервере выполняет запросы к БД, поступающие от вашего процесса.  
 
ПРИМЕЧАНИЕ
Вообще, для сетевых форм IPC (но не обязательно только для них) очень часто используется концепция "клиент-сервер". Как вы понимаете, "клиент" - это приложение, которому требуются данные, "сервер" - приложение, предоставляющее данные.  
 
А если брать только взаимодействие программ, выполняющихся на одном компьютере, самым банальным примером будет следующий: текст из вашего текcтового редактора передается в электронную таблицу или программу для верстки. Да-да, наш старый знакомый буфер обмена - это тоже один из механизмов IPC!  
И еще можно было бы привести очень много примеров.  
 
Средств, обеспечивающих взаимодействие между процессами, создано достаточно много. Огромное их количество реализовано в Windows 9x, еще больше - в Windows NT/2000. Теперь нужно приличное количество времени, чтобы хотя бы познакомиться со всеми! Замечу, что нет, и наверное в принципе не может быть универсального способа обмена данными, который годился бы на все случаи жизни - все равно в некоторых случаях использование другого способа будет предпочтительнее. Но я надеюсь, что после прочтения этой статьи вы сможете достаточно уверенно ориентироваться в мире IPC и обоснованно выбирать тот или иной метод.  
 
Тот факт, что механизмы IPC работают на уровне операционной системы, положительно сказывается на скорости и надежности программ и программных комплексов, построенных с их использованием. Эффективность приложений соответственно возрастает.  
 
Вообще, правильнее было бы называть эти механизмы "Interthread Communication" - межпотоковое взаимодействие. Если вы помните, выполняются именно потоки, они же и обмениваются данными. Однако, смысл для отдельных механизмов взаимодействия появляется только в том случае, если эти потоки принадлежат разным процессам. Ведь потоки, выполняющиеся в рамках одного процесса, вовсе не нуждаются в дополнительных средствах для общения между собой. Так как они разделяют одно адресное пространство, обмен данными могут обеспечить обычные переменные. Таким образом, IPC становится необходим в том случае, если поток одного процесса должен передать данные потоку другого процесса.  
 
Теперь давайте рассмотрим основные виды IPC и случаи, в которых они используются.  
 
Буфер обмена (clipboard)
Это одна из самых примитивных и хорошо известных форм IPC. Он появился еще в самых ранних версиях Windows. Основная его задача - обеспечивать обмен данными между программами по желанию и под контролем пользователя. Впрочем, вы наверняка сами неплохо знаете, как используется буфер обмена... ;-) Не рекомендуется использовать его для внутренних нужд приложения, и не стоит помещать туда то, что не предназначено для прямого просмотра пользователем.  
Сообщение WM_COPYDATA
Стандартное сообщение для передачи участка памяти другому процессу. Работает однонаправленно, принимающий процесс должен расценивать полученные данные как read only. Посылать это сообщение необходимо только с помощью SendMessage, которая (напомню) в отличие от PostMessage ждет завершения операции. Таким образом, посылающий поток "подвисает" на время передачи данных. Вы сами должны решить, насколько это приемлемо для вас. Это не имеет значения для небольших кусков данных, но для больших объемов данных или для real-time приложений этот способ вряд ли подходит.  
Разделяемая память (shared memory)
Этот способ взаимодействия реализуется не совсем напрямую, а через технологию File Mapping - отображения файлов на оперативную память. Вкраце, этот механизм позволяет осуществлять доступ к файлу таким образом, как будто это обыкновенный массив, хранящийся в памяти (не загружая файл в память явно). "Побочным эффектом" этой технологии является возможность работать с таким отображенным файлом сразу нескольким процессам. Таким образом, можно создать объект file mapping, но не ассоциировать его с каким-то конкретным файлом. Получаемая область памяти как раз и будет общей между процессами. Работая с этой памятью, потоки обязательно должны согласовывать свои действия с помощью объектов синхронизации.  
Библиотеки динамической компоновки (DLL)
Библиотеки динамической компоновки также имеют способность обеспечивать обмен данными между процессами. Когда в рамках DLL объявляется переменная, ее можно сделать разделяемой (shared). Все процессы, обращающиеся к библиотеке, для таких переменных будут использовать одно и то же место в физической памяти. (Здесь также важно не забыть о синхронизации.)  
Протокол динамического обмена данными (Dynamic Data Exchange, DDE)
Этот протокол выполняет все основные функции для обмена данными между приложениями. Он очень широко использовался до тех пор, пока для этих целей не стали применять OLE (впоследствии ActiveX). На данный момент DDE используется достаточно редко, в основном для обратной совместимости.  
Больше всего этот протокол подходит для задач, не требующих продолжительного взаимодействия с пользователем. Пользователю в некоторых случаях нужно только установить соединение между программами, а обмен данными происходит без его участия. Замечу, что все это в равной степени относится и к технологии OLE/ActiveX.  
 
OLE/ActiveX
Это действительно универсальная технология, и одно из многих ее применений - межпроцессный обмен данными. Хотя cтоит думаю отметить, что OLE как раз для этой цели и создавалась (на смену DDE), и только потом была расширена настолько, что пришлось поменять название ;-). Специально для обмена данными существует интерфейс IDataObject. А для обмена данными по сети используется DCOM, которую под некоторым углом можно рассматривать как объединение ActiveX и RPC.  
Каналы (pipes)
Каналы - это очень мощная технология обмена данными. Наверное, именно поэтому в полной мере они поддерживаются только в Windows NT/2000. В общем случае канал можно представить в виде трубы, соединяющей два процесса. Что попадает в трубу на одном конце, мгновенно появляется на другом. Чаще всего каналы используются для передачи непрерывного потока данных.  
Каналы делятся на анонимные (anonymous pipes) и именованные (named pipes).  
Анонимные каналы используются достаточно редко, они просто передают поток вывода одного процесса на поток ввода другого.
Именованные каналы передают произвольные данные и могут работать через сеть. (Именованные каналы поддерживаются только в WinNT/2000.)  
 
Сокеты (sockets)
Это очень важная технология, т.к. именно она отвечает за обмен данными в Интернет. Сокеты также часто используются в крупных ЛВС. Взаимодействие происходит через т.н. разъемы-"сокеты", которые представляют собой абстракцию конечных точек коммуникационной линии, соединяющей два приложения. С этими объектами программа и должна работать, например, ждать соединения, посылать данные и т.д. В Windows входит достаточно мощный API для работы с сокетами.  
Почтовые слоты (mailslots)
Почтовые слоты - это механизм однонаправленного IPC. Если приложению известно имя слота, оно может помещать туда сообщения, а приложение-хозяин этого слота (приемник) может их оттуда извлекать и соответствующим образом обрабатывать. Основное преимущество этого способа - возможность передавать сообщения по локальной сети сразу нескольким компьютерам за одну операцию. Для этого приложения-приемники создают почтовые слоты с одним и тем же именем. Когда в дальнейшем какое-либо приложение помещает сообщение в этот слот, приложения-приемники получают его одновременно.  
Объекты синхронизации
Как ни странно, объекты синхронизации тоже можно отнести к механизмам IPC. Конечно, объем передаваемых данных в данном случае очень невелик ;) Но именно эти объекты следует использовать, если одному процессу нужно передать другому что-то вроде "я закончил работу" или "я начинаю работать с общей памятью".  
Microsoft Message Queue (MSMQ)
Этот протокол действительно оправдывает свое название - он обеспечивает посылку сообщений между приложениями с помощью очереди сообщений. Основное его отличие от стандартной очереди сообщений Windows в том, что он может работать с удаленными процессами и даже с процессами, которые на данный момент недоступны (например, не запущены). Доставка сообщения по адресу гарантируется. Оно ставится в специальную очередь сообщений и находится там до тех пор, пока не появляется возможность его доставить.  
 
Удаленный вызов процедур (Remote Procedure Call, RPC)
Строго говоря, это не совсем технология IPC, а скорее способ значительно расширить возможности других механизмов IPC. С помощью этой технологии общение через сеть становится совешенно прозрачным как для сервера, так и для клиента. Им обоим начинает казаться, что их "собеседник" расположен локально по отношению к ним .  
Резюме
Конечно, я перечислил далеко не все способы обмена данными. Если бы это было так, то это было бы не так интересно ;-) За рамками данной статьи остались такие вещи, как глобальная таблица атомов, хуки и некоторые другие технологии, которые с некоторой натяжкой можно признать механизмами IPC. Но главное, как я считаю, сделано: теперь вы знаете, что это за непонятные аббревиатуры и как из всего многообразия методов IPC выбрать наиболее подходящий.

Всего записей: 24 | Зарегистр. 28-01-2003 | Отправлено: 13:21 29-01-2003
ValidolX

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
большое списибо!
можна доку на ПМ?

Всего записей: 1713 | Зарегистр. 22-07-2001 | Отправлено: 15:30 31-01-2003
react



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ,
 если кто знает - напишите плиз где можно поподробнее почитать про sockets, pipes,  
  shared memory под Винды - нужны основные функции и методы использования,
  а если у ково есть исходняки простеньких программок под винды для обмена  
  информацией между процесорами с использованием sockets, pipes, shared memory,
  поделитесь плиз по возможности...
 
  Заранее большое спасибо !!!
 
Добавлено
 

Всего записей: 773 | Зарегистр. 08-02-2002 | Отправлено: 02:38 02-04-2004
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Про Named Pipes в свое время я что то такое писал:  
http://www.oswald.h1.ru/pr/pipe.html

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 10:15 02-04-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arion

Цитата:
Про Named Pipes в свое время я что то такое писал

А я про FileMapping "и других" прямо здесь:
http://forum.ru-board.com/topic.cgi?forum=33&topic=2467&start=0#lt

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 14:13 02-04-2004
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В данной области дучше всего книга Рихтера по программированию под Win32.
 
Поищи по форуму здесь на нее ссылок было много.

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 14:46 02-04-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
drobitko

Цитата:
В данной области дучше всего книга Рихтера по программированию под Win32.  

Всегда об этом говорю...
Рихтер. "Programming Applications for Microsoft Windows, 4lh ed".  
Eсть и бумажное русское издание ("Питер", 2001) и 3 варианта в электронном виде (в т.ч. русское, весом более 3 Мб с примерами)...  
Одно из них: _http://alexsoft.home.nov.ru/download/prog  
Рус. 5.3 Мб в *.chm

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 15:53 02-04-2004
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И еще одно почтенное издание :
Дж. Рихтер Дж Кларк Программирование серверных приложений для Microsoft Windows 2000

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 08:36 03-04-2004 | Исправлено: Arion, 08:38 03-04-2004
react



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2 All:
 Thanks a lot !!!
 
Arion

Цитата:
Дж. Рихтер Дж Кларк Программирование серверных приложений для Microsoft Windows 2000

 
 А где взять не подскажешь ???

Всего записей: 773 | Зарегистр. 08-02-2002 | Отправлено: 09:55 04-04-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
react

Цитата:
А где взять не подскажешь?

"Мелькала" на резусе, но там сейчас проблемы...
Спроси здесь: http://forum.ru-board.com/topic.cgi?forum=35&bm=1&topic=16945&start=2320#lt

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 10:40 04-04-2004
Arion



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Могу дать электронный вариант на английском языке.

Всего записей: 436 | Зарегистр. 29-06-2003 | Отправлено: 11:09 04-04-2004
react



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arion

Цитата:
Могу дать электронный вариант на английском языке.

 
 Не откажусь !!!

Всего записей: 773 | Зарегистр. 08-02-2002 | Отправлено: 08:41 06-04-2004
wiwiw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
про IPC читай MSDN (Platform SDK),
а на счет COM - порта - так делать нельзя

Всего записей: 127 | Зарегистр. 20-03-2004 | Отправлено: 19:33 07-04-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » методы обмена данными между процессами


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru