2017-02-15 28 views
2

У меня есть программа GUI, которая запускает программу cli нажатием кнопки. Я хочу видеть окно консоли и не нужно ждать, пока программа cli не закончится. Поэтому я использую такой код:QProcess :: startDetached() Не показывать окно консоли

QProcess::startDetached("cmd.exe"); 

После нажатия кнопки я не вижу окно консоли. Но см. Процесс cmd.exe в диспетчере задач.

Я попытался использовать команду system(), но он заморозил мое приложение до завершения программы cli.

Есть ли способ сделать окно видимым?

ответ

-1

Ожидаемое поведение. По крайней мере, в Windows startDetached эквивалентно вызову CreateProcess с флагом DETACHED_PROCESS, где новый процесс не наследует консоль своего родителя. Имеет смысл, что на других платформах метод будет делать что-то подобное.

В этом случае вам пришлось вручную назначить новый, используя AllocConsole в новом процессе (помните, что вам может потребоваться перенаправить ручки потоковой передачи на новую консоль) или попытаться запустить процесс в другом (проверьте CreateProcess или fork).

BTW, причина system Замораживает ваше приложение, потому что это синхронный вызов, поэтому он не будет возвращать элемент управления, пока не завершится другой процесс. Вы можете попробовать позвонить system из отдельного потока, и таким образом вы избегаете блокировки основного цикла событий вашего приложения.

+0

Благодарим вас за ответ. Теперь я использую команду QThread и system(). Это решение делает код более сложным, но это работа и кросс-платформенный. – Andrey

+0

BTW, если вы не возражаете против использования Boost в дополнение к Qt, и если вызов 'system' может быть полностью асинхронным, вы можете сделать его в одной строке:' boost :: thread ([]() {system ("cmd.exe");}); ' – cbuchart

 Смежные вопросы

  • Нет связанных вопросов^_^