在Windows上使用QProcess启动一个进程后发送Ctrl+C事件

3
我有一个对话框,作为控制台应用程序的配置器。对话框的工作是向用户提供一组窗口小部件(这些小部件反映了控制台应用程序支持的选项),当用户单击“开始”按钮时,根据GUI中的小部件状态,对话框创建并启动一个具有控制台应用程序名称和参数的QProcess。我能够成功地启动进程,一切正常。然而,当我想要终止进程时,控制台应用程序需要优雅地关闭,意味着它必须关闭文件、刷新数据、关闭设备等,然后终止。
我使用了QProcess :: close(),这会立即杀死应用程序,使应用程序无法优雅地关闭。
我已经使用了Win32 GenerateConsoleCtrlEvent(CTRL_C_EVENT, Q_PID::dwProcessId) 发送了一个事件到同一个进程。我看到上述API返回了一个非零值(表示成功,失败时将返回0),但我的进程仍在运行。
有人能帮我解决如何向QProcess发出优雅关闭的信号吗?或者还有其他方法吗?

你确定所涉及的应用程序能够优雅地处理 Ctrl-C 吗?你有它的源代码吗? - Kuba hasn't forgotten Monica
是的,我的代码正在处理Ctrl+C和Ctrl+Break事件。 - Bharath
1个回答

1

GenerateConsoleCtrlEvent 接受进程组 id,而不是进程 id。你可能正在提供一个进程 id,因为这是 QProcess 提供的。

QProcess 目前不支持创建进程组。你需要使用 winapi 手动启动进程,或者修补 Qt 的副本以修改 qtbase/src/corelib/io/qprocess[.h,.cpp,_win.cpp] 以传递 CREATE_NEW_PROCESS_GROUP 创建标志。

如果你不想调整 Qt 本身,可以将 qprocess 文件复制到你的项目中,重命名类,并在那里添加更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接