QT中呼叫外部程式的方法

2021-04-09 07:52:01 字數 1877 閱讀 4312

上個月有人寫信問我這個問題,當時做了比較詳細的回答,把回答內容放上來,也許對其它 人會有些用處的吧。有些地方我的理解可能也不正確,歡迎指正:

問題:++

回答:

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...