2017-02-15 253 views
2

我有一個GUI程序,通過單擊按鈕啓動cli程序。我想看看控制檯窗口,不需要等到cli程序結束。所以我使用這樣的代碼:QProcess :: startDetached()不顯示控制檯窗口

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

點擊按鈕後,我沒有看到控制檯窗口。但請參閱任務管理器中的cmd.exe進程。

我試圖使用system()命令,但它凍結CLI程序結束之前我的應用程序。

有什麼辦法讓窗口可見嗎?

回答

-1

這是預期的行爲。至少在Windows中,startDetached等同於使用DETACHED_PROCESS標誌調用CreateProcess標誌,其中新進程不繼承其父控制檯。這是合理的,在其他平臺的方法會做類似的事情。

在這種情況下,您必須在新進程上使用AllocConsole手動分配一個新進程(請注意,您可能需要將流處理重定向到新控制檯),或嘗試以不同的方式啓動進程方式(檢查CreateProcessfork)。

順便說一句,原因system凍結你的應用程序是因爲它是一個同步調用,所以它不會返回控件,直到其他進程結束。您可以嘗試從單獨的線程調用system,這樣可以避免阻止應用程序的主事件循環。

+0

謝謝你的回答。現在我使用QThread和system()命令。該解決方案使代碼更復雜,但這是工作和跨平臺。 – Andrey

+0

順便說一句,如果不介意在Qt之外使用Boost,並且如果'system'調用可以完全異步,則可以將它放在一行中:'boost :: thread([](){system( 「cmd.exe」);});' – cbuchart