Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват stdin/stdout другого консольного процесса.  (Прочитано 15891 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
alexey
Участник

ua
Offline Offline
Пол: Мужской

« : 02-09-2010 19:38 » 

Хочу сделать графическую надстройку над консольным приложением.
Создать новый процес и передать ему аргументы не сложно.
Но само консольное приложение работает в диалоге с пользователем, значит, простой вызов system() не прокатит... Жаль
Пробую этот механизм реализовать на Qt, используя класс QProcess.
В нём есть возможность установить сигнал readAllStandardOutput и выводить его куда-то... Здесь была моя ладья...
Но мне надо ещё и вводить данные пользователем.

Может, кто видел уже решение этого, не важно, на какой билиотекЕ (GTK+, WxWidgets, boost, Qt и т.д.)?
« Последнее редактирование: 03-09-2010 07:44 от Sel » Записан
alexey
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #1 : 02-09-2010 20:03 » 

Ой, уже и сам решил свою же проблему Улыбаюсь

У QProcess есть метод write(). Он позволяет передать строку для ввода.
У меня не работало потому что в конце не было символа завершения строки "\n".
И всего то делов.
Можно закрывать тему Да-да
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 02-09-2010 20:03 » 

а вот это не оно разве
Цитата
void QProcess::setStandardErrorFile ( const QString & fileName, OpenMode mode = Truncate )
Redirects the process' standard error to the file fileName. When the redirection is in place, the standard error read channel is closed: reading from it using read() will always fail, as will readAllStandardError(). The file will be appended to if mode is Append, otherwise, it will be truncated.

See setStandardOutputFile() for more information on how the file is opened.

Note: if setProcessChannelMode() was called with an argument of QProcess::MergedChannels, this function has no effect.

This function was introduced in Qt 4.2.

See also setStandardInputFile(), setStandardOutputFile(), and setStandardOutputProcess().

void QProcess::setStandardInputFile ( const QString & fileName )
Redirects the process' standard input to the file indicated by fileName. When an input redirection is in place, the QProcess object will be in read-only mode (calling write() will result in error).

If the file fileName does not exist at the moment start() is called or is not readable, starting the process will fail.

Calling setStandardInputFile() after the process has started has no effect.

This function was introduced in Qt 4.2.

See also setStandardOutputFile(), setStandardErrorFile(), and setStandardOutputProcess().

void QProcess::setStandardOutputFile ( const QString & fileName, OpenMode mode = Truncate )
Redirects the process' standard output to the file fileName. When the redirection is in place, the standard output read channel is closed: reading from it using read() will always fail, as will readAllStandardOutput().

If the file fileName doesn't exist at the moment start() is called, it will be created. If it cannot be created, the starting will fail.

If the file exists and mode is QIODevice::Truncate, the file will be truncated. Otherwise (if mode is QIODevice::Append), the file will be appended to.

Calling setStandardOutputFile() after the process has started has no effect.

This function was introduced in Qt 4.2.

See also setStandardInputFile(), setStandardErrorFile(), and setStandardOutputProcess().
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 02-09-2010 20:58 » 

lyoha, подумай над такой потенциальной проблемой, как взаимная блокировка процессов. Когда два процесса связаны каналами для ввода и вывода и оба становятся на взаимный блокируемый ввод. Пока один из процессов не будет убит, второй так и будет ждать ввода. Аналогичная блокировка возможна и по выводу: когда буфер канал переполнен выводящий процесс блокируется и возможна такая же ситуация взаимной блокировки, хоть и менее вероятная, чем с вводом.
« Последнее редактирование: 02-09-2010 21:00 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 03-09-2010 03:10 » 

для этого есть многопоточность Улыбаюсь
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 03-09-2010 03:42 » 

Моделей IO много. И в многопоточном можно заблокироваться, если поток вывода будет ожидать на каком-либо механизме синхронизации поток ввода. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 03-09-2010 05:02 » 

незаблокироваться можно, если есть возможность посмотреть, сколько данных лежит в буфере - и <не читать лишнего>/<не толкать лишнего> Улыбаюсь
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 03-09-2010 06:43 » 

Леш, это неверный подход. Существуют механизмы узнать готовность IO до выполнения операции.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 03-09-2010 06:47 » 

не использовать IO Улыбаюсь вещь в себе, что-то делает но никто не знает, что именно, но вещь крутая и наверняка нужная Улыбаюсь
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 03-09-2010 07:42 » 

Точно: файлов не читаем, ничего не сохраняем, все записываем на бумажку Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 03-09-2010 22:55 » new

если бы это был windows, то я бы сказал API, и ничего кроме API:
Using the Console
SetStdHandle() GetStdHandle()  GetConsoleScreenBufferInfo() ReadConsoleInput()/WriteConsole()
устройства CONIN$ и CONOUT$
 Скромно так...
« Последнее редактирование: 03-09-2010 22:57 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines