2012-05-29 18 views
1

我有多個線程運行以下QProcess。隨機地他們失敗,出現錯誤狀態5. Qt文檔沒有提供任何更多細節。有沒有人知道這個錯誤可能來自哪裏?非常感謝你。QProcess錯誤狀態5的原因是什麼?

extCmd = new QProcess(this); 

QString cmd = "/usr/bin/php"; 
QStringList argStr; 
argStr << "/bin/sleep" << "10"; // changed to ever working command 
extCmd->start(cmd, args); 
bool suc = extCmd->waitForFinished(-1); 
if (!suc) { 
    qDebug() << "finishing failed error=" 
      << extCmd.error() 
      << extCmd.errorString(); 
} 

給我的輸出:

finishing failed error= 5 "Unknown error" 
+1

錯誤代碼5是默認的錯誤代碼,可能是您正在調用的進程失敗而不是QProcess? – cmannett85

+0

什麼在cmd和參數?把那也 – ScarCode

+0

嗨,謝謝你看看。我添加了命令和參數內容。 – spikey

回答

4

切到你的問題是事實,你應該首發每個每個進程中的線程。 QProcess在完成時發出一個finished(int code, QProcess::ExitStatus status)信號。它也將分別在成功和不成功的啓動時發出started()error()。將所有這三個信號連接到QObject中的一個插槽,然後啓動該過程並處理插槽中的結果。你不需要任何額外的線程。

如果您收到started()信號,那麼您可以確定該進程的文件名是正確的,並且該進程已啓動。無論您從finished(int)得到的退出代碼是否表明該過程的作用,可能是爲了迴應您可能已傳遞給它的潛在無效論點。如果您收到error()信號,則該過程無法啓動,因爲您給QProcess::start()指定了錯誤的文件名,或者您沒有正確的權限。

你不應該寫異步發生異步的代碼。同步代碼是阻止特定事情發生的代碼,如調用waitForCmdFinished。我希望有一個Qt配置標誌禁用所有剩下的同步阻塞API,就像有一個禁用/啓用Qt 3支持API的標誌一樣。這些阻止API的可用性促使像上面的代碼那樣可怕的黑客入侵。這些API應該默認禁用恕我直言。就像應該將QThread和派生類移動到另一個線程一樣。這也是我可以找到的每個公開可用代碼示例中的糟糕設計的標誌,而且我做了相當徹底的搜索以說服自己,我沒有發瘋或什麼。

我記得Qt中waitxxx方法唯一合理的用法就是等待QThread完成。即使如此,也只能在~QThread之內調用,以防止QThread在踏面仍在運行時被破壞。

+0

謝謝你的迴應,我選擇它作爲我的問題的答案,因爲沒有直接的回答。我嘗試了不同的方法。首先,爲了在多線程應用程序中使用QProcess,避免_blocking_(同步)代碼已成爲必須。其次,我創建了一個單獨的線程,通過獨立於其他線程處理隊列來處理所有請求。 – spikey