Отправка события Ctrl+C процессу, запущенному с помощью QProcess в Windows
У меня есть диалог, который действует как конфигуратор для консольного приложения. Задача диалогового окна состоит в том, чтобы предложить пользователю набор виджетов (которые отражают параметры, поддерживаемые консольным приложением), и когда пользователь нажимает кнопку "Пуск", диалоговое окно создает и запускает QProcess с именем и параметрами консольного приложения на основе состояние виджетов в графическом интерфейсе. Я могу запустить процесс успешно, и все работает нормально. Однако, когда я хочу завершить процесс, консольное приложение должно корректно завершить работу, то есть оно должно закрыть файлы, сбросить данные, закрыть устройства и т. Д., А затем завершить работу.
Я использовал QProcess::close(), это сразу убивает приложение, и приложение не может завершить работу изящно.
Я использовал Win32 GenerateConsoleCtrlEvent(CTRL_C_EVENT, Q_PID::dwProcessId)
чтобы отправить даже к тому же. Я вижу, что вышеприведенный API возвращает ненулевое значение (указывая на успех, он вернул бы 0 при сбое), но мой процесс продолжает выполняться.
Может кто-нибудь помочь мне с тем, как я могу изящно сигнализировать QProcess для отключения? Или есть другой способ сделать это?
1 ответ
GenerateConsoleCtrlEvent
принимает идентификатор группы процессов, а не идентификатор процесса. Вы, вероятно, передаете ему идентификатор процесса, так как это то, что QProcess
обеспечивает.
QProcess
не поддерживает создание группы процессов в данный момент. Вам нужно либо запустить процесс вручную, используя winapi, либо исправить вашу копию Qt, чтобы исправить qtbase/src/corelib/io/qprocess[.h,.cpp,_win.cpp]
пройти CREATE_NEW_PROCESS_GROUP
флаг создания.
Если вы не хотите настраивать сам Qt, вы можете скопировать файлы qprocess в свой проект, переименовать класс и добавить туда изменения.