上個月有人寫信問我這個問題,當時做了比較詳細的回答,把回答內容放上來,也許對其它 人會有些用處的吧。有些地方我的理解可能也不正確,歡迎指正:
問題:++
回答:
1)完全可以使用fork,execv函式,其實qprocess類只是對這些底層函式的封裝而
已,但是考慮到使用qprocess的話,不需要自己處理程式管道,也不需要自己處理
windows下的情況,可以省去很多時間,因此還是推薦使用qprocess,他們的效果
將是一樣的。
2)照你的需求,完全可以不需要使用執行緒,因為qprocess已經自己處理掉這些事
了,在使用qprocess的start函式執行外部程式後,這個函式不會被阻塞,另外
qprocess也會以事件的方式自動將外部程式傳回的資訊反饋回來。具體看以下這個
簡單的例子:
class
enstcdrecord :
public
qobject
... ;
enstcdrecord::enstcdrecord(qwidget
*pparent)
...
bool
enstcdrecord::createcd(
const
qstring
&pimagefile)
..."-v"
"speed=2""
cdrecord.exe
", cmdlist);
while(!
mprocess.waitforfinished(
300))
...->
processevents();
//防止ui死鎖,一般情況下,用這種等一小段時間(這
裡是300ms),讓ui響應一次的辦法,已經足夠使用了。}if
(mprocess.exitcode() !=0
) ...
return
true;}
void
enstcdrecord::readprocessoutput()
...
外部程式究竟使用stdout還是使用stderr來作為執行時狀態的輸出,各個程式的處
理方式都不一樣,甚至可能根本沒有輸出,這個需要自己試驗。
3)一般網路程式中只要在主線程中使用qsocket和qsocketnotifier,就可以完成
資料的傳送和接收了,它們不會造成程式介面死鎖。在我寫的blog的情況下,我的
程式在從網路上接收到資料後,需要做一些計算處理和儲存工作,由於資料量很
大,並且程式對效能的要求比較高,因此只能將整個網路資料接收功能放到執行緒中
了,在那種情況下,qsocket並不適用,而必須使用同步的qsocketdevice。
其實,qt3下提供兩種網路訪問功能,一類是qftp, qhttp, qsocket, and
qsocketnotifier等,它們都會在接收到資料後,以事件方式進行通知。另一類是
qsocketdevice,它不會主動發出任何通知事件,而是必須靠外部程式來查詢,或
者等待其接收到資料,才能知道何時有資料被收到。
《c++
gui programming with qt3》中的那句話沒有錯,(但是它是針對qt3說的,
在qt4中根本就沒有這幾個類了,並且qt4中thread也可以用事件了)。在qt3中,
只有 ui執行緒在可以使用事件,在其它輔助線程中是無法使用的,因此不能使用靠
事件進行通知的那幾個類了。
我的程式中沒有使用qsocketnotifier,正如前面說的,這個類只是配合qsocket使
用的,它是考事件進行通知的。我的程式使用的是 qsocketdevice,並且靠其wait
功能,來等待資料到達。
QT呼叫外部程式
qt呼叫外部程式 system calc.exe qprocess execute calc.exe qprocess startdetached calc.exe qprocess pro new qprocess pro start calc.exe 注釋 1 前兩種方法會阻塞程序,直到計算器程...
Qt中呼叫外部程式開啟檔案
qdesktopservices openurl qurl fromlocalfile filename filename 檔名,如c 新建 microsoft word 文件.doc qurl fromlocalfile 一定要用這個方法,因為檔名或路徑中中文或空格,不然打不開檔案.直接用qurl...
QT下呼叫外部程式
qt呼叫shell 或 外部程式有三種方法 第一種方法,是呼叫linux c 函式庫中的 system const char string system opt ts test 第二種方法 qprocess execute opt ts test 第三種方法 qprocess poc new qpr...