|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
|
Эксперты по Pipes заходите28.12.2023, 18:53. Показов 2340. Ответов 12
Метки нет (Все метки)
Решил изучить Pipes и возникла следующая проблема.
Имею десктопное приложение, которое получает и отправляет данные с консольного приложения. Само консольное приложение не видно. Т.е. я создаю дочерний процесс консольного приложения, который запускается фоново, к которому подключаю анонимные каналы через CreatePipe. Всё работает. Т.е. у меня получается отправить или принять данные с консольного приложения. Вот только после записи в канал (отправки текста к консольному приложению), я больше не могу читать из канала (получать данные из консольного приложения). Проблема в том, что моя функция, которая записывает в канал, закрывает дескриптор (handle) для записи в канал, чтобы дочерний процесс прекратил читать. Но вот этот дескриптор нужен для следующей записи, а он уже закрыт. Т.е. получается так, что я не могу отправить текст от десктопного приложения к консольному более одного раза. Что посоветуете?
0
|
|
| 28.12.2023, 18:53 | |
|
Ответы с готовыми решениями:
12
Человеки не пролистывайте, заходите
Все, кто знают о сайтостроении.Заходите |
|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
|
| 29.12.2023, 01:57 [ТС] | |
|
Может я плохо объясняю. Попробую иначе.
Есть родительский процесс, который создает дочерний процесс. Между двумя процессами должен идти двусторонний обмен информацией. Для этого я устанавливаю две трубы (канала). Трубы направленные, поэтому для двусторонней связи нужно иметь две трубы: одна от родителя к потомку, вторая - от потомка к родителю. У каждого конца трубы есть дескриптор (handle). Итого есть 4 дескриптора. Схематически это выглядит так: IN_WRITE (родитель) >>> OUT_WRITE (потомок) OUT_READ (родитель) <<< IN_READ (потомок) Дескрипторы труб со стороны потомка (OUT_WRITE и IN_READ) закрываются сразу же после создания процесса, ибо они не нужны. Действие Write to Pipe Дескриптор IN_WRITE используется для функции WriteFile, с помощью которой я отправляю данные от родителя к потомку. Действие Read from Pipe Дескриптор OUT_READ используется для функции ReadFile, с помощью которой я читаю данные от потомка к родителю. Действие Read from Pipe я могу повторить много раз. Проблема с действием Write to Pipe. Дело в том, что после WriteFile я закрываю дескриптор IN_WRITE (без этого у меня не получается больше Read from Pipe и так советуют в документации). Но, как вы понимаете, после закрытия дескриптора одна труба становится непригодной. Я могу дальше использовать вторую трубу для Read from Pipe, но я больше не могу отправить данные от родителя к потомку (действие Write to Pipe), ибо не имею валидного дескриптора для WriteFile. Таким образом, с помощью анонимных двух труб я могу получить сколько угодно данных от потомка к родителю, но у меня получается только один раз отправить данные от родителя к потомку. Но мне нужно, чтобы я имел такую возможность много раз.
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 29.12.2023, 11:50 | |
|
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
||
| 29.12.2023, 11:54 | ||
|
Royal_X, надо поразбираться с кодами ошибок. Может, флажок ошибки какой-то скидывать надо
Добавлено через 1 минуту
0
|
||
|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
|
| 29.12.2023, 11:56 [ТС] | |
|
Алексей1153, если не закрывать, то после WriteFile зависает. В коде на сайте майкрософт тоже закрывают. И вот получается, что для чтения ничего закрывать не нужно, поэтому я могу получить данные от дочернего процесса к родителю сколько угодно. Но вот для записи я закрываю и соответственно только раз могу отправить от родителя к потомку
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 29.12.2023, 11:59 | |
|
Royal_X, думаю, нужно прицепить проект с примером, в котором кто-то смог бы поковыряться
0
|
|
|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
||||||
| 29.12.2023, 12:08 [ТС] | ||||||
|
Алексей1153, ок
Алексей1153, в коде я использую Sleep, но это временное решение, потом поставлю таймеры, чтобы не блокировать главный процесс. Добавлено через 4 минуты Алексей1153, на 243 я закрываю и отсюда проблема
0
|
||||||
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 29.12.2023, 12:30 | |
|
0
|
|
|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
|
| 29.12.2023, 12:39 [ТС] | |
|
0
|
|
|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
|
| 29.12.2023, 15:49 [ТС] | |
|
Алексей1153, кстати, на скриншоте результат чтения после успешной отправки команды "uci".
Т.е. сперва мы прочли 61 символ с дочернего процесса (их на скриншоте нет, т.к. второе чтение их уже удалило. Там была одна строка - приветствие шахматного движка) Потом мы отправили текст "uci" - 3 символа. Эта команда просит движку вывести все доступные опции движка. И далее мы получили 1242 символа, которые видны на скриншоте. Раз получили этот текст, то команда uci была успешно отправлена и отработана дочерним процессом. Upd Алексей1153, проблема решена
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 29.12.2023, 15:53 | |
|
Royal_X, что было?
0
|
|
|
6178 / 2871 / 1042
Регистрация: 01.06.2021
Сообщений: 10,508
|
|
| 29.12.2023, 21:39 [ТС] | |
|
Связь с движком работает, всё получилось
![]() Кто хочет, может тестировать. Рядом с программой должен лежать файл "stockfish.exe". Хотя, вы можете использовать любой движок с таким именем... Движок скачать можно отсюда. Не забудьте переименовать файл на "stockfish.exe" и положить рядом с программой. В архиве также есть текстовый файл с описанием команд UCI-протокола.
1
|
|
| 29.12.2023, 21:39 | |
|
Помогаю со студенческими работами здесь
13
Ищу крутую и динамическую музыку! Заходите, не стесняйтесь! Создаем тест Векслера. Кто готов поучаствовать заходите Платный хостинг Можно получить БЕСПЛАТНО заходите халява Фраза 'Заходите сюда' в теге title. Есть ли санкции? Эксперты обобщенного программирования Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|