QEventLoop和QNAM的QTimer超时问题

时间:2010-09-23 14:18:00

标签: qt timeout qnetworkaccessmanager qeventloop

我创建了自己的HTTP类,它利用QNAM并提供发送HTTP请求的方法。它使用QEventLoop进行同步,使用QTimer进行超时。

我的解决方案几乎没有问题。在某些Symbian平台上,我的QTimer信号超时太快(例如在超时为30秒后1秒后)。如果我的HTTP Post playload很大或者我正在通过GET下载文件(请求需要一些时间才能完成),通常会发生这种情况。我想要注意,相同的代码在某些设备上运行正常(S60 3rd ed。)但另一方面,一些设备(第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第3版/第5版

工具:诺基亚Qt SDK

1 个答案:

答案 0 :(得分:0)

我也确实存在这类问题。使用方法QEventLoop的本地产生奇怪的结果,比如阻止一些要处理的事件(然后循环永不退出),或者像解释一样,导致QTimer在超时之前触发太快(然后循环退出得太早)。 在循环的父对象的构造函数中使用一个实例字段初始化一次,似乎解决了这个问题。 我在Qt 4.6.3和Symbian S60 / 5th Edition上。