【问题标题】:Sending Ctrl+C event to a process launched using QProcess on Windows将 Ctrl+C 事件发送到在 Windows 上使用 QProcess 启动的进程
【发布时间】:2014-03-07 16:46:47
【问题描述】:

我有一个对话框,它充当控制台应用程序的配置器。对话框的工作是为用户提供一组小部件(反映控制台应用程序支持的选项),当用户单击“开始”按钮时,对话框会创建并启动一个 QProcess,其控制台应用程序的名称和参数基于GUI 中小部件的状态。我能够成功启动该过程,并且一切正常。但是,当我想终止进程时,控制台应用程序需要正常关闭,这意味着它必须关闭文件、刷新数据、关闭设备等,然后终止。

我使用了 QProcess::close(),这会立即杀死应用程序并且应用程序无法正常关闭。

我已使用 Win32 GenerateConsoleCtrlEvent(CTRL_C_EVENT, Q_PID::dwProcessId) 向同一设备发送偶数。我看到上面的 API 返回一个非零值(表示成功,失败时返回 0),但我的进程继续运行。

谁能帮助我如何通知 QProcess 正常关闭?或者有没有其他方法可以做到这一点?

【问题讨论】:

  • 您确定有问题的应用程序实际上可以优雅地处理 Ctrl-C 吗?你有它的源代码吗?
  • 是的。我的代码正在处理 Ctrl+C 和 Ctrl+Break 事件。

标签: c++ windows qt qt5 qprocess


【解决方案1】:

GenerateConsoleCtrlEvent 采用进程 group id,而不是进程 id。您可能会为其提供一个进程 ID,因为这是 QProcess 提供的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多