-2

サーバーを呼び出す Qt を使用してライブラリを構築しています。HTTP 応答 (QNetworkReply オブジェクト) を待機する同期関数を構築する必要があり、これを実現するために QEventLoop を使用しています。現在、サーバーは呼び出されますが、ループは応答が終了するのを待たず、代わりに空の QNetworkReply オブジェクトを続行します。

まったく同じ関数が、1 つのスレッドと main からこの関数への呼び出しのみを含む、私が構築した単純なテスト プロジェクトで機能します。返信が待たれ、すべてが期待どおりに機能します。しかし、複数のスレッドを含む私のプロジェクトでは、上記のシナリオが発生し、イベント ループは応答を待ちません。要求はサーバーに送信され、そこに表示されますが、関数が既に実行されているため、応答が QNetworkReply オブジェクトに返されません。

これが私の機能のネットワークセクションです。私のプロジェクトでは、statusCode 変数は常に 0 になり、応答は空になりますが、単純なテスト シナリオでは 200 であり、期待される HTTP 応答です。

QNetworkAccessManager* networkManager = new QNetworkAccessManager(this);
QNetworkReply* reply = networkManager->get(request);

QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qInfo() << "Http Get completed with status code:" << statusCode.toInt();
4

2 に答える 2

0

原因

すみません、聞いてませんでした…

つまり、リクエストが行われた後finishedにシグナルに接続するため、リクエストが行われた時点で誰もあなたのシグナルを聞いていません。

解決

でリクエストを送信する前に、 QNetworkAccessManager::finished に接続します。networkManager->get(request)

QNetworkAccessManagerの詳細な説明をよくお読みください。クラスを適切に使用する方法の例があります。例えば:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
        this, &MyClass::replyFinished);

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
于 2021-01-04T15:01:52.840 に答える