2011-05-09 160 views
4

此代碼有什麼問題?我無法寫入已被分離的新進程的標準輸入。 對我來說,新過程是分離的對我來說很重要。QProcess.startDetached()並寫入其標準輸入

QProcess commandLine; 
commandLine.setWorkingDirectory("E:\\"); //does not work. 
commandLine.startDetached("cmd.exe");  //works (but uses wrong working dir). 
commandLine.write("echo hi\0");   //writes nothing. 
commandLine.write("\n\r");    //Still nothing is written! 

回答

7

早上好。

問題是QProcess::startDetached()是一個靜態方法,它會創建一個「繼續而忘記」的過程。

這意味着,您不能以這種方式設置工作目錄。所有你能做的就是致電

QProcess::startDetached (const QString &program, const QStringList &arguments, const QString &workingDirectory); 

然而,這會給你寫入新創建進程的標準輸入的問題。事情是,因爲你沒有QProcess對象,所以你可以編寫標準輸入。可能有一個解決方案使用處理方法提供的靜態方法startDetached()

我們公司也有類似的問題。我們需要超越調用程序生命週期的獨立進程,併爲此設置環境。看起來,看起來Qt代碼是不可能的。

我的解決方案是使用自己的startDetached()方法使用圍繞QProcess的包裝。 它做了什麼,它實際上在堆上創建了QProcess子類,並使用其普通的start()方法。然而,在這種模式下,一旦完成處理就觸發的信號將在一個刪除對象本身的插槽上調用:delete this;。有用。該過程獨立運行,我們可以設置一個環境。

所以基本上沒有必要使用分離開始方法。只要您的QProcess是堆上的對象,就可以使用普通的啓動方法。如果你在這種情況下關心內存泄漏,你必須提供類似於上述的機制。

問候
d

0

調用靜態方法與參數不提供任何集合的過程中爲孩子命令。

process.startDetached(command) 

試試這個:

QProcess process; 
process.setProgram(fileName); 
process.setArgument(argsList); 
process.setWorkingDirectory(dirName); 
process.startDetached();