0

そのため、Qt で簡単なコードを実行して、特定の Web ページのコンテンツを返そうとしています。簡単な調査を行った後、プロセスを簡素化する独自のクラスを開発することができました。

WebFetch::WebFetch()
{
    nam = new QNetworkAccessManager(this);
    connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
}

QString WebFetch::get(QString url)
{
    nam->get(QNetworkRequest(QUrl(url)));
}

void WebFetch::finished(QNetworkReply* reply)
{
    QByteArray data = reply->readAll();
    QString str(data);
}

ただし、上記のコードで見つけた大きな問題は、呼び出しが非同期であることです。「get」関数が取得された後に単に文字列を返すようにしたいのですが、完了した信号を待つ必要があるという理由でこれは不可能に思えます。 「完成した」スロットによって。上記の方法に代わるものはありますか、または「終了」によって取得されたコンテンツを返すために「取得」する方法はありますか? どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

呼び出しが非同期であることは問題ではありません。これは大きなメリットです。同期呼び出しを使用すると、本質的に、何かが戻ってくるのをぼんやりと待っているだけで、潜在的に数百 KB の RAM とスレッド全体が浪費されます。物事が同期的に、または「迅速に」発生するふりをしながら、そのようなコードを書くことはできません。このような同期コードを GUI スレッドで実行することの狂気については、コメントしません。突然すべての GUI コードが再入可能になるため、ローカル イベント ループを実行することも非常に悪い考えです。私の賭けは、あなたがそのために設計もテストもしていないということです。

結果を期待しているコードを 2 つの部分に分解する必要があります。最初の部分はリクエストを配置する必要があります。スロット内の 2 番目の部分は、要求が終了したときに通知され、実行されることは何でも続行します。

すべてを 1 つのメソッドにまとめたい場合は、C++11 を使用します。

QNetworkAccessManager * mgr = ...;
QObject::connect(mgr, &QNetworkAccessManager::finished, 
[this, mgr](QNetworkReply * reply){
  // here you can do things with the reply
});
mgr->get(QNetworkRequest("....");

完全な例については、imgur からランダムな画像を取得するこの 300 行の写真モザイク ジェネレーターを参照してください。上記のスタイルで、非同期のマルチスレッド処理とラムダを広範囲に使用します。

于 2014-04-21T22:39:42.690 に答える