1. 程式人生 > >QT中呼叫外部程式的方法

QT中呼叫外部程式的方法

    我做的那個小軟體的圖形介面是基於QT3.2的,在主介面的命令列編輯框輸入命令以後要執行別人已經寫好的可執行檔案。這些可執行檔案執行的時間比較長,在終端上執行時會顯示一些執行的資訊,最後才顯示執行結果。我的介面上有一個文字框,我想把它們在後臺執行過程中的資訊不斷新增到文字框中,相當於實時顯示吧,不過要求也不是那麼高。

    我說我現在怎麼做的吧,我在一個叫做QGUI_CommandWidget類(屬於主視窗)中定義了一個命令列編輯框輸入命令,定義一個QTextEdit物件用來顯示那些執行資訊,定義了一個自定義的MyThread類物件用來執行外部程式,在這個執行緒的run函式裡我呼叫fork,execv函式執行外部程式,把可執行程式的標準輸出重定向到管道,然後從管道讀那些資訊,再把這些資訊用QApplication::postEvent()函式傳回主執行緒,由主執行緒把這些資訊append到文字框中。

    我現在的疑問是:
        第一,執行外部程式,用fork、execv函式是不是不行,非要用QProcess不可?為什麼呢?論壇上講的也不是很清楚。具體怎麼做呢?在那個QGUI_CommandWidget類建立一個QProcess類物件還是在我MyThread類物件裡再建立一個QProcess類物件?
        第二,基於qt3的GUI執行緒和非GUI執行緒的通訊,應該怎麼做?那個外部程式我是不能更改的,它什麼時候結束我也不知道。用QProcess的話它的輸出資訊我要怎麼樣才能讀到然後回顯在我的主視窗的文字框中?怎麼知道可執行程式結束然後殺死該執行緒?
        第三,我在《C
++ GUI programming with qt3》中看到:“ QTimer 類以及應用於網路的QFtp, QHttp, QSocket, and QSocketNotifier 類都是基於訊息事件迴圈的,所以也不能用在非GUI執行緒中。”這是為什麼呢?還有我看了別人用QQSocketdevice的例子裡都用到了QSocketNotifier。在你的部落格說到用Qthread、QQSocketdevice、QWaitCondition可以完成視訊採集,你是否也用到QSocketNotifier?