我創建了自己的HTTP類,它利用QNAM並提供發送HTTP請求的方法。它使用QEventLoop進行同步,並使用QTimer進行超時。QEventLoop和QNAM的QTimer超時問題
我在解決方案時遇到了一些問題。在某些Symbian平臺上,我的QTimer信號超時太快(例如,在超時30秒後1秒後)。如果我的HTTP Post playload很大,或者如果我通過GET下載文件(請求需要一些時間才能完成),通常會發生這種情況。我想說明的是,相同的代碼在某些設備上工作正常(S60第3版),但另一方面,某些設備(第5版)幾乎總是會出現此錯誤。
下面的代碼片段:
MyHttp::MyHttp(QObject *parent) : QObject(parent)
{
m_Timer.setSingleShot(true);
connect(&m_Manager, SIGNAL(finished(QNetworkReply*)), SLOT(OnFinished(QNetworkReply*)));
connect(&m_Timer, SIGNAL(timeout()), SLOT(OnTimeout()));
}
void MyHttp::Post(const QString &data)
{
m_RetCode = 0;
QNetworkRequest request(url);
m_Reply = m_Manager.post(request, data.toAscii()); // QPointer<QNetworkReply> m_Reply
m_Timer.start(30*1000);
m_EventLoop.exec(); // Synchronization point
}
void MyHttp::OnFinished(QNetworkReply * reply)
{
// Handle response/Timeout/Errors
reply->deleteLater(); // Use deleteLater() as adviced in the documentation
StopWaiting();
}
void MyHttp::StopWaiting()
{
m_Timer.stop();
m_EventLoop.exit();
}
void MyHttp::OnTimeout()
{
m_RetCode = TIMEOUT; // #define TIMEOUT 50000
if(m_Reply.isNull() == false)
{
// Abort reply
m_Reply->abort();
}
}
我個人認爲以下情況之一可能導致問題:
- 重新進入本地事件循環攪亂信號
- 我多次使用相同的QNAM(同一會話期間有多個請求)。這是必需的,因爲如果我摧毀了QNAM,我的會話在服務器端就會關閉。
是否有人能夠看到一些可能導致此行爲的錯誤?
平臺:Symbian的S60第三版/第五版
工具:諾基亞的Qt SDK
這可能是Qt內部的一些錯誤,但不能確定。也許發佈bugreport給他們。無論如何,我會建議不要使用這種遞歸事件循環方式來做事情。它使事情變得複雜,並且(如你所說)可能會弄髒東西。 – guruz 2010-09-24 10:59:30
感謝您的回覆。 – Routa 2010-09-29 09:12:09
有誰知道本地事件循環可以創建什麼樣的問題?例如:1.我可以失去一些事件嗎? 2.我可以兩次獲得同一個事件嗎? 3.它可以導致QTimer改變它的行爲嗎? 4. QNAM存在的一些問題(例如,未完成信號傳遞) – Routa 2010-09-29 12:33:58