@Door

Односторонняя передача информации между процессами?

Здравствуйте,

описываю ситуацию:

есть родительский процесс(WindowProc присутствует), который порождает новый, дочерний процесс. Дочернему процессу нужно как-то оповещать родительский процесс о прогрессе выполнения какой-то задачи — т.е., по сути, передавать числа от 0 до 100 (или от 0 до 1, не столь важно). Но нужно это делать без какой-либо задержки дочернего процесса (т.е. записать в memory map, отослать event и подождать другой event об успешности чтения нельзя; по той же причине, не получиться использовать pipe, поскольку нужно будет ждать «подключения» (ConnectNamedPipe)).


Есть какое-либо решение?
  • Вопрос задан
  • 4192 просмотра
Пригласить эксперта
Ответы на вопрос 4
@kaladhara
Сокеты подойдут?
Ответ написан
@vScherba
Можно использовать оконные сообщения WM_USER через PostMessage. У Вас передаются целые числа, которые влезают в lParam, wParam, так что даже не придется перекачивать данные через общую память, пайпы и сокеты.
Даже не обязательно создавать для этого окно, можно использовать PostThreadMessage.
В родительском процессе читать уведомление в цикле выработки сообщений. Если такового нет, то создать в новом потоке.
Ответ написан
@mayorovp
Мои варианты:

1. Самый простой — stdout, он же стандартный вывод. Если перенаправить его в анонимный канал, то родительский процесс сможет читать, что туда пишет дочерний. Если родительский процесс завершится, дочерний будет получать ошибку при записи в канал. Зависание дочернего процесса возможно только в одном случае — если он запишет в канал более 4КБ текста, а родитель не будет этого читать.

2. Аналогичный первому — создать пару TCP-сокетов, соединенных друг с другом. Достоинство — дочерний процесс теперь может использовать неблокирующий режим, что предотвратит его блокировку (ценой потери части данных в том случае, когда родитель их не читает).

3. Просто использовать циклический буфер в разделяемой памяти, с односторонней установкой некоторого события. Можно даже использовать буфер размера 1 — то есть всегда записывать в одно и то же место. Данные могут теряться, но для уведомления о прогрессе это несущественно.

4. Использовать общий семафор — дочерний процесс делает Release, родитель — Wait. Недостаток — невозможно асинхронное ожидание, нет передачи, собственно, сообщений — только подсчет.
Ответ написан
Комментировать
@Razario777
Если по каким-то причинам нельзя перенаправить вывод, то я бы выбрал UDP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы