Qt進程的創建及注意事項

以下介紹QProcess類在使用過程中的方法以及注意事項:
QProcess的作用是在當前進程中創建一個新的進程,來調用外部程序處理完成一些任務而不影響本進程的繼續執行,起用法如下:
1. 運用QProcess類創建新進程:
QProcess proc = new QProcess();


2. 鏈接進程退出時返回狀態的槽函數:
QObject::connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), reciever, SLOT(onFinished(int, QProcess::ExitStatus)));
注意:QProcess::ExitStatus爲非基本數據類型,鏈接信號槽是有可能不起作用,因此需要用QProcess::ExitStatus註冊一個元對象類型,如下:
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");這樣Qt收到finished信號時才能正確轉到相應的槽函數。


3. 啓動新進程(另外一個可執行文件)
proc->start(execPath);
※execPath爲可執行文件的路徑,如果路徑中帶有空格,可用 "\"" + execPath + "\"" 進行處理,即讓傳入的路徑本身爲字符串。
※用 proc->start("\"" + execPath + "\""); 進行啓動
注意:如果啓動的進程需要傳遞參數,proc->start();的第二個參數是一個QStringList,可以傳入參數,但是此時傳入的參數不需要前後加空格,
例如:啓動的可執行程序爲ls,需要傳遞的參數爲-la /usr/,即實現ls -al /usr/ 的效果,則傳入參數時(QStringList args),
可以用 args << "-al" << "/usr/"; 如果寫成 args << " -al " << " /usr/ ";(即參數前後加空格了),則可能會導致進程啓動失敗。


4. 等待新進程徹底啓動成功:
proc->waitForStarted(int msecs = 30000);
注意:該函數的調用會阻塞當前的界面,直到進程完全啓動。如果在指定的msecs內沒有啓動成功,則解除阻塞,返回false。


proc->waitForFinished(int msecs = 30000);
注意:該函數的調用會阻塞當前的界面,直到啓動的進程結束,發送finished(int, QProcess::ExitStatus)信號以後,界面纔可以動。
所以一般情況下,如果是在界面線程啓動一個新的進程,不會調用該函數,當進程結束後,發送了finished信號,然後做相應處理就行了。


在非GUI線程中,爲了保證調用的進程能夠啓動或超時處理,會調用以上兩個函數,確保進程能夠正常啓動或結束,如果在指定的msecs
內沒有啓動成功或進程結束,則解除阻塞,返回false。


5. 進程結束後,用槽函數對返回結果進行接收與處理:

void onFinished(int code, QProcess::ExitStatus status) {}


掃碼關注公衆號【三個程序員】接收實時消息。


發佈了58 篇原創文章 · 獲贊 83 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章