【问题标题】:QTimer timeout problems with QEventLoop and QNAMQEventLoop 和 QNAM 的 QTimer 超时问题
【发布时间】:2010-09-23 14:18:00
【问题描述】:

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

我的解决方案遇到了一些问题。在某些 Symbian 平台上,我的 QTimer 信号超时太快(例如,在 1 秒后超时为 30 秒)。如果我的 HTTP Post 播放负载很大或者我通过 GET 下载文件(请求需要一些时间才能完成),通常会发生这种情况。我想指出,相同的代码在某些设备(S60 第 3 版)上运行良好,但另一方面,某些设备(第 5 版)几乎总是出现此错误。

这是一个代码sn-p:

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 3rd/5th edition

工具:诺基亚 Qt SDK

【问题讨论】:

  • 这可能是 Qt 内部的一些错误,但不确定。也许向他们发布错误报告。无论如何,我建议不要使用这种递归事件循环的方式来做事。它使事情复杂化,并且(如你所说)可能会搞砸。
  • 有谁知道本地事件循环会产生什么问题?例如: 1. 我可以输掉一些赛事吗? 2. 我可以两次获得相同的事件吗? 3. 会不会导致 QTimer 改变它的行为? 4. QNAM 的一些问题(例如完成未发出信号)

标签: qt timeout qnetworkaccessmanager qeventloop


【解决方案1】:

我也遇到过这样的问题。对 QEventLoop 方法使用 local 会产生奇怪的结果,比如阻塞一些要处理的事件(然后循环永远不会退出),或者像解释的那样,在超时之前引发 QTimer 过快触发(然后循环过早退出)。 在循环的父对象的构造函数中使用初始化一次循环的实例字段,似乎可以解决问题。 我使用的是 Qt 4.6.3 和 Symbian S60/5th Edition。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多