![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
dron4ik |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всем привет! Задание: Оба приложения через фиксированные промежутки времени передают друг другу строку текста, включающую дескриптор приложения и текущее время.
Требование к заданию: 1) Используя средства языка Object Pascal, разработать в соответствии с индивидуальным заданием приложения ПI и П2 (П2 - «дочернее»). 2) Для организации автоматической записи/чтения данных используйте стан-дартный системный компонент-таймер TTimer с интервалом «срабатывания» не бо¬лее 2-4 с. 3) Обратите внимание, текст сообщения об ошибке, возникающей при работе с каналом можно получить с помощью вызова SysErTorMessage(GetLastError). Немного теории по заданию: Для создания анонимных каналов (далее просто «каналы») в ОС Windows ис¬пользуется функция CreatePipe. Она возвращает два дескриптора, имеющие права GENERIC_READ (OENERIC_WRJTE) и SYNCHRONIZE на доступ к «входу» и «выходу» канала. Для записи и чтения данных необходимо использовать соответственно функции WriteFile и ReadFile. Как только канал перестаёт быть необходимым, его необходимо уничтожить с помощью функции CIoseHandle. Типичное использование анонимного канала состоит в создании канала пере¬дачи данных между родительским и дочерним процессом. В руководстве [1] для этого рекомендуется выполнять переназначение стандартного ввода и вывода в дочер¬нем процессе. Рассмотрим общую схему такого переназначения: 1) Получить дескриптор стандартного входного/выходного потока с помощью функции OctSldHandle и сохранить его для дальнейшего использования. 2) Создать канал, вызвав функцию CreatePipe. 3) Вызвать функцию SetStdHandle, чтобы переназначить стандартные потоки чте-ния и записи. 4) Создать дочерний процесс с помощью функции CrcaieProcess. При этом необхо¬димо указать, что дочерний процесс должен наследовать дескрипторы процесса, в том числе потоки ввода/вывода. Рассмотрим программный фрагмент, реализующий данную схему (с двухсто¬ронним доступом к каналу): var 01d_Input, 01d_Output: THandle; Нашел задание--Приложение П1 непрерывно через фиксированные промежутки времени выводит пользовательский текст в канал. Приложение П2 записывает данные из канала в файл-протокол.(все требованию такие же). Как можно переделать вот этот код под своё задание? Приложение 1. Листинг программы |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Создай два пайпа (через CreateNamedPipe), в один будет писАть П1, читать П2, второй - наоборот, пишет П2, читает П1. И по таймеру читаешь тот пайп, в который второе приложение записало свой ID и время, и пишешь в свой пайп свои опознавательные знаки, чтоб другое приложение могло их прочесть по своему таймеру.
Или тебе обязательно со стандартными потоками извращаться (я про STD_INPUT_HANDLE/STD_OUTPUT_HANDLE)? |
dron4ik |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
надо обязательно извращаться(
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
В таком случае у тебя проблема - анонимные пайпы - они однонаправленные, вот в чем дело. А тебе нужны двунаправленные, поскольку ты не только хочешь с одной стороны писать, а с другой - читать, но и наоборот.
|
dron4ik |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
А как это реализовать тогда?
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Я написал выше: использовать именованные пайпы, которые могут работать в режиме FULL_DUPLEX, то есть в них можно одновременно добавлять/извлекать данные с обоих сторон. В MSDN, если не ошибаюсь, был пример использования named pipes для организации IPC (InterProcess Communication, в смысле, МежПроцессного Взаимодействия)
|
![]() ![]() |
![]() |
Текстовая версия | 13.07.2025 2:01 |