【问题标题】:QProcess::startDetached() not show console windowQProcess::startDetached() 不显示控制台窗口
【发布时间】:2017-07-04 16:12:37
【问题描述】:

我有一个通过单击按钮启动 cli 程序的 GUI 程序。我想看到控制台窗口,不需要等到 cli 程序结束。所以我使用这样的代码:

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

单击按钮后,我看不到控制台窗口。但是在任务管理器中查看cmd.exe进程。

我尝试使用 system() 命令,但它在 cli 程序结束之前冻结了我的应用程序。

有没有办法让窗口可见?

【问题讨论】:

    标签: c++ windows qt command-prompt qt5.8


    【解决方案1】:

    这是预期的行为。至少在 Windows 中,startDetached 等效于使用 DETACHED_PROCESS 标志调用 CreateProcess,其中新进程不会继承其父进程的控制台。在其他平台上,该方法会做类似的事情是有道理的。

    在这种情况下,您必须在新进程上使用 AllocConsole 手动分配一个新进程(请注意,您可能需要将流式处理句柄重定向到新控制台),或者尝试在不同的方式(检查CreateProcess 或fork)。

    顺便说一句,system 冻结您的应用程序的原因是因为它是一个同步调用,因此在其他进程完成之前它不会返回控制权。您可以尝试从单独的线程调用system,这样可以避免阻塞应用程序的主事件循环。

    【讨论】:

    • 感谢您的回答。现在我使用 QThread 和 system() 命令。此解决方案使代码更加复杂,但这是可行且跨平台的。
    • 顺便说一句,如果不介意在 Qt 之外使用 Boost,并且如果 system 调用可以完全异步,则可以在一行中进行:boost::thread([]() { system("cmd.exe"); });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多