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