QFtp 阻塞式呼叫

2021-09-25 12:45:08 字數 1281 閱讀 9974

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函式,如果緩衝區中沒有資料...