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.