我有一个GUI程序,通过单击按钮启动cli程序。我想看看控制台窗口,不需要等到cli程序结束。所以我使用这样的代码:QProcess :: startDetached()不显示控制台窗口
QProcess::startDetached("cmd.exe");
点击按钮后,我没有看到控制台窗口。但请参阅任务管理器中的cmd.exe进程。
我试图使用system()命令,但它冻结CLI程序结束之前我的应用程序。
有什么办法让窗口可见吗?
这是预期的行为。至少在Windows中,startDetached
等同于使用DETACHED_PROCESS
标志调用CreateProcess
标志,其中新进程不继承其父控制台。这是合理的,在其他平台的方法会做类似的事情。
在这种情况下,您必须在新进程上使用AllocConsole
手动分配一个新进程(请注意,您可能需要将流处理重定向到新控制台),或尝试以不同的方式启动进程方式(检查CreateProcess
或fork
)。
顺便说一句,原因system
冻结你的应用程序是因为它是一个同步调用,所以它不会返回控件,直到其他进程结束。您可以尝试从单独的线程调用system
,这样可以避免阻止应用程序的主事件循环。
谢谢你的回答。现在我使用QThread和system()命令。该解决方案使代码更复杂,但这是工作和跨平台。
顺便说一句,如果不介意在Qt之外使用Boost,并且如果'system'调用可以完全异步,则可以将它放在一行中:'boost :: thread([](){system( “cmd.exe”);});'