![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обмен данными между процессами.
Strate © (2009-02-16 12:23:00)Приветствую. Пишу программку, одна часть которой будет работать как сервис, а вторая - как оболочка пользователя. Причём основная функция оболочки - отображать некие данные, полученные из сервиса, а побочная - подавать некие команды сервису на выполнение, и получать результат выполнения этих команд. С получением данных выкрутился с помощью Memory Mapped Files, а вот с вызовом удалённых процедур никак не могу придумать. Самоу умное что приходит в голову - в сервисе запускать "ждущий" Thread, который будет ждать пока некий флаг не изменит своё состояние. Сменить флаг можно и из клиента. Но решение мне лично кажется немного кривым. Можно было бы выкрутиться с помощью стандартных Windows-сообщений, но сервис не имеет окон, да и не желательно из использовать, если запуск будет в виде службы Windows. Кто что может посоветовать, какие технологии использовать?
Спасибо большое заранее.
KSergey (2009-02-16 16:33:00) [1]> Медвежонок Пятачок © (16.02.09 14:52) [19]
> которые по tcp:80 разрешают выходить с рабочего места наружу?
Да! :)
Медвежонок Пятачок (2009-02-16 14:52:00) [2]которые по tcp:80 разрешают выходить с рабочего места наружу?
Медвежонок Пятачок (2009-02-16 14:52:00) [3]каких?
KSergey (2009-02-16 14:45:00) [4]> Медвежонок Пятачок © (16.02.09 14:14) [16]
Гнать таких сотрудников. И админов за одно.
Медвежонок Пятачок (2009-02-16 14:14:00) [5]кто хоть раз с работы управлял каким-нибудь универсал шаре даунлоадером, стоящим дома, тот тот обычно не парится над вопросом как организовать взаимодействие между процессами.
Вариант (2009-02-16 14:07:00) [6]
> Обмен данными между процессами.
>
> Strate (16.02.09 12:23)
> Приветствую. Пишу программку, одна часть которой будет работать
> как сервис, а вторая - как оболочка пользователя.
Я так понимаю это разные процессы - сервис и оболочка пользователя?
В этом случае мое мнение (ИМХО):
Варианты с посылкой сообщения (PostThreadMessage или SendMessage) от оконного приложения к сервису и от сервиса к приложению мне кажутся неудачными. Причина - отчасти в [13], второе поведение на различных ОС Windows может требовать доп. условий, зависящих от платформы - подробнее на эту тему смотри в MSDN например о PostThreadMessage. Более универсальные варианты на мой взгляд (и лучшие опять таки на мой взгляд) предложены в [2] (pipe и TCP/IP). Хотя если речь идет об одном флаге и работе программ на одной машине, то вполне можно было бы использовать и например именованное событие - смотри CreateEvent (обратим внимание на правила именования) или мьютекс.
KSergey (2009-02-16 13:27:00) [7]> clickmaker © (16.02.09 12:59) [10]
> WM_COPYDATA?
Да, именно так.
> насколько я знаю, нет. Оно только для синхронной отправки
Ваапще, конечно, да, я уже после ка кнаписал задумался о том, что речь про PostThreadMessage.
Впрочем, если понадеяться на счастье и передать указатель на глобальную структуру... :)
(не, это глпуость, конечно)
Сергей М. (2009-02-16 13:08:00) [8]
> clickmaker © (16.02.09 13:03) [12]
Тогда снрвис становится зависимым от опции взаимодействия с раб.столом
clickmaker (2009-02-16 13:03:00) [9]ксати, можно и фиктивное окно создать
AllocateHWnd()
тогда можно и SendMessage( WM_COPYDATA использовать
Сергей М. (2009-02-16 13:01:00) [10]Для сервис-приложений, использующих дельфийский"шаблон", треды TServiceThread ожидают сообщение CM_SERVICE_CONTROL_CODE
Цитата:
{ TServiceThread }
const
CM_SERVICE_CONTROL_CODE = WM_USER + 1;
Прочие сообщения попросту игнорируются.
clickmaker (2009-02-16 12:59:00) [11]> [7] KSergey © (16.02.09 12:48)
WM_COPYDATA?
насколько я знаю, нет. Оно только для синхронной отправки
KSergey (2009-02-16 12:56:00) [12]> Сергей М. © (16.02.09 12:52) [8]
> Смотря кем и кому оно посылается
Т.е.?! не понял в чем разница.
Окей, пусть будет клиентским приложением сервису.
А если наоборот? я что-то не улавливаю разницу.
Сергей М. (2009-02-16 12:52:00) [13]
> KSergey © (16.02.09 12:48) [7]
Смотря кем и кому оно посылается
KSergey (2009-02-16 12:48:00) [14]> Сергей М. © (16.02.09 12:44) [5]
> > WM_COPY вроде ж тоже пройдет?
> Что значит "пройдет" ?
Для засылки в PostThreadMessage, не вру?
Сергей М. (2009-02-16 12:46:00) [15]
> Strate (16.02.09 12:43) [4]
> как быть в более сложным вариантом?
Смотря насколько он "сложен".
Сергей М. (2009-02-16 12:44:00) [16]
> KSergey © (16.02.09 12:41) [2]
> WM_COPY вроде ж тоже пройдет?
Что значит "пройдет" ?
Strate (2009-02-16 12:43:00) [17]
> Для простых команда с одним параметром вполне подойдет PostThreadMessage
Отлично, спасибо, попробую =)
А как быть в более сложным вариантом?
clickmaker (2009-02-16 12:42:00) [18]> но сервис не имеет окон
окна не обязательны. Достаточно создать очередь сообщений и получать их в цикле - PeekMessage или GetMessage
самый удобный способ в плане программирования - DCOM. Поскольку там передача и получение данных сводится к простому вызову методов.
Но для этого сервис должен быть зарегистрирован как COM-сервер, а клиент импортировать его tlb
KSergey (2009-02-16 12:41:00) [19]можно сервис сделать СОМ-сервером, можно DDE сервером, можно открыть в нем слушать TCP/IP или pipe....
> Сергей М. © (16.02.09 12:28) [1]
> Для простых команда с одним параметром вполне подойдет PostThreadMessage
WM_COPY вроде ж тоже пройдет?
Сергей М. (2009-02-16 12:28:00) [20]Для простых команда с одним параметром вполне подойдет PostThreadMessage