qt應用由於要跑在嵌入式linux系統中,裡面的qt版本是4.8,所以決定採用qftp來進行檔案傳輸。qftp有個問題是非同步呼叫的,所以用起來很不方便,所以決定用qeventloop來阻塞處理。
qftp *ftp = new qftp(this);
qeventloop loop;
connect(m_ftp, signal(commandfinished(int,bool)), loop, slot(quit()));
ftp->get("test.dat");
loop.exec();
這個方案的思路是,呼叫ftp命令以後,開啟事件迴圈,但是覺得還是有點問題的。如果ftp執行命令後,就已經發出commandfinished訊號了,那loop就沒法退出了。測試了一下這個方案,基本上都沒問題,但是還是覺得有問題。
方案一的問題就是無法保證commandfinished訊號在loop.exec()後面發出。改進方案如下:
//主要實現
private:
//定義乙個全域性變數,用於標識命令是否完成
bool m_bftpcmdfinish;
//定義乙個阻塞等待
void waitftpfinish(int msec)
}private slots:
//fpt命令開始訊號
void onftpcmdstart(int cmd)
//ftp命令結束訊號
void onftpcmdfinish(int cmd)
//呼叫
qftp *m_ftp = new qftp(this);
connect(m_ftp, signal(commandstarted(int)), this, slot(onftpcmdstart(int)));
connect(m_ftp, signal(commandfinished(int,bool)), this, slot(onftpcmdend(int)));
//防止ftp的commandstarted還沒發出來,導致m_bcmdfinish沒有復位,waitftpfinish就直接結束了
m_bcmdfinish = false;
m_ftp->get("test.dat");
//如果get呼叫以後,還沒往下執行就結束了,那麼m_bcmdfinish肯定為true了,則waitftpfinish直接返回。
//如果沒有直接返回,那就一直等著以100ms為檢測週期
waitftpfinish(15000);
阻塞式 非阻塞式IO
知識點 非阻塞式io 的兩種設定方法 1 函式fcntl 設定 o nonblock 選項 int flag fcntl sockfd,f getfl,0 檢查檔案標誌位 fcntl sockfd,f setfl,flag o nonblock 設定檔案標誌位 2 函式ioctl 設定fionbio...
阻塞式Socket VS 非阻塞式Socket
主要有三種型別的socket,永久阻塞模式 阻塞加超時模式和非阻塞式。socket模式可以通過apr socket opt set 和apr socket timeout set 這兩個api控制。在windows和unix系統上預設的socket是永久阻塞模式 apr so nonblock ti...
阻塞和非阻塞系統呼叫
阻塞 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。例如,我們在csocket中呼叫receive函式,如果緩衝區中沒有資料...