2010-09-23 26 views
1

我創建了自己的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

+0

這可能是Qt內部的一些錯誤,但不能確定。也許發佈bugreport給他們。無論如何,我會建議不要使用這種遞歸事件循環方式來做事情。它使事情變得複雜,並且(如你所說)可能會弄髒東西。 – guruz 2010-09-24 10:59:30

+0

感謝您的回覆。 – Routa 2010-09-29 09:12:09

+0

有誰知道本地事件循環可以創建什麼樣的問題?例如:1.我可以失去一些事件嗎? 2.我可以兩次獲得同一個事件嗎? 3.它可以導致QTimer改變它的行爲嗎? 4. QNAM存在的一些問題(例如,未完成信號傳遞) – Routa 2010-09-29 12:33:58

回答

0

我已經確切地,諸如此類的問題,以及。對方法使用本地方法QEventLoop會產生奇怪的結果,例如阻塞一些要處理的事件(然後循環永遠不會退出),或者像解釋的那樣,引發QTimer在超時之前觸發得太快(然後循環太早退出)。 在循環的父對象的構造函數中使用實例字段初始化一次循環似乎可以解決問題。 我在Qt 4.6.3和Symbian S60/5th Edition上。