我的目的是:
在主程序里調用"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發過來的輸出了.
最后來張圖紀念一下這個下午吧:
