QProcess怎么實時的讀到output的信息


在Qt里想與子程序通信, 一般都會用到QProcess這個類, 而且手冊里也提到了很多通信的方法, 比如手冊里的 "Communicating via Channels". 我也不例外, 用的也是這貨, 但在實際操作中, 還是遇到不少問題....

我的目的是:
    在主程序里調用"lftp.exe"來將一些文件上傳到服務器上.

貌似很簡單啊, 開工吧:
connect( &_process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadOutput()));
connect( &_process, SIGNAL(finished( int, QProcess : :ExitStatus)), this, SLOT(onFinished( int, QProcess : :ExitStatus)));

QString cmd = QString( "lftp -c 'open -e \"lcd d:/data; mirror -R ./ \" admin:admin@localhost'"); 
_process.start(cmd, QProcess : :ReadWrite);

運行發現, onReadOutput()函數就是不調用, 這要不說明qt有BUG(-____-! 基本不可能), 要不就是我哪里寫錯了.
把命令換成 'ping localhost', 發現 onReadOutput()可以成功調用, 那應該就是一開始寫的命令有問題.  把命令拷出來在命令行里執行, 發現是可以看到輸出信息的, 然后大腦就斷路了... 這是哪兒的問題啊.

調了很久, 注意到一個細節, 就是在命令行運行時, 輸出的信息是一直在一行里的, 而沒有換行, 也就是我們經常寫的:
printf( "hello world\r");

這會導致一直不換行, 而在進程間通信的時候, 是以\n來作為命令或緩沖區結束的標志的, 所以在我的程序中, 直到程序運行完畢, 也沒有觸發 readyReadStandardOutput信號.

知道了原因, 就得想解決辦法來讓主程序可以收到點什么, 好讓用戶認為上傳過程還沒死....

仔細看lftp的幫助后, 發現了-v這個參數...
-v這個參數是用來輸出一些多余的信息的, 而打印多余的信息都是有\n結尾的...

所以最后就把命令改成了:
QString cmd = QString( "lftp -c 'open -e \"lcd d:/data; mirror -veR ./ \" admin:admin@localhost'"); 

OK了, 程序可以接收到lftp發過來的輸出了.
最后來張圖紀念一下這個下午吧:






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM