在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發過來的輸出了.
最後來張圖紀念一下這個下午吧:
來自為知筆記(wiz)
QProcess 實時讀取程序輸出
qscopedpointerm process m process.reset new qprocess this connect m process.data signal readyreadstandardoutput this,slot onreadyread connect m proces...
C 是否讀到檔案尾, 怎麼判斷
不是問題的問題,看樣子真成了問題 多年前寫都是直接判斷 eof,現在發現沒有這個方法了 對不起,是寫程式過程中的總結,只是對我做了簡單記錄一下 讀入檔案 streamreader sr filestream fs try catch ioexception e while sr.endofstrea...
QProcess的簡單應用
由於涉及到跨語言程式設計 c python matlab 我採取的策略是生成exe檔案,然後統一在qt平台下進行執行處理,中間放棄了生成dll的方式,不過也可以,只是生成exe不用估計標頭檔案 在使用qprocess的時候有幾個 注意的問題 1 路徑盡量使用 不能使用 可以使用 但是容易出錯 2 盡...