Отправка события 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 в свой проект, переименовать класс и добавить туда изменения.

Другие вопросы по тегам