1

QNAM を利用し、HTTP 要求を送信する手段を提供する独自の HTTP クラスを作成しました。同期には QEventLoop を使用し、タイムアウトには QTimer を使用します。

私は自分のソリューションでいくつかの問題に直面しています。特定の Symbian プラットフォームでは、私の QTimer シグナルのタイムアウトが速すぎます (たとえば、タイムアウトが 30 秒のときに 1 秒後など)。これは通常、HTTP Post プレイロードが大きい場合、または 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 3rd/5th エディション

ツール: Nokia Qt SDK

4

1 に答える 1

0

私もまさにそのような悩みを抱えています。メソッド QEventLoop に local を使用すると、一部のイベントの処理がブロックされる (ループが終了しない) などの奇妙な結果が生成されます。または、説明したように、QTimer がタイムアウト前に起動するのが速すぎる (ループが終了するのが早すぎる) などです。ループの親オブジェクトのコンストラクターで一度初期化されたループのインスタンス フィールドを使用すると、問題が解決するようです。私は Qt 4.6.3 と Symbian S60/5th Edition を使用しています。

于 2011-12-26T17:18:49.473 に答える