在QT中使用同步阻塞式HTTP請求的方法


QT中對HttpRequest的實現是利用了QT的singal-slot實現的異步請求,雖然有時這很有用,比如節約時間,不會使UI卡住等,但有時,我們還是需要阻塞式的同步HTTP請求,因為在這個HTTP請求返回之前是不能繼續工作的,比如登錄等任務,沒有登錄成功就不能繼續,此時,我們可以利用QEventLoop進行循環,等待HTTP請求的完成.



QEventLoop 用來在QT經常程序中實現延遲,循環等任務. 在QEventLoop創建后,程序就會一直循環在這里.退出QEventLoop循環的方法是調用它的quit()方法.所以,我們的HTTP請求可以改寫為下面的形式:

 

?
1
2
3
4
// httpResponse 等部分省略
QEventLoop loop;
QObject::connect(response,SIGNAL(finished()),&loop,SLOT(quit()));
loop.exec();

我們為HTTP請求的完成事件創造一個slot,即loop的quit事件,這樣,在HTTP請求完成后,loop循環才會結束.這樣就達到了同步HTTP請求的目的.

 

但是,如果遇到網絡問題等.HTTP請求超時,這里就會卡很長時間,所以,有必要加一個超時判斷:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// httpResponse 等部分省略
QEventLoop loop;
QTimer timer;
QObject::connect(response,SIGNAL(finished()),&loop,SLOT(quit()));
QObject::connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit()));
timer.start(1000);
loop.exec();
 
if (timer.isActive()){
     timer.stop();
     return true ;
} else {
     response-> abort ();
     return false ;
}

這樣,在HTTP請超過1s時,返回false. 成功時返回true.


免責聲明!

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



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