QNetworkAccessManagerでHTTPリクエストを別のスレッドで実行したい。現在、QT4.6では同じスレッドで実行されているため、ブラウザがハングします。この機能は最近QT4.8で導入されましたが、現在はQT4.8に切り替えることができません。したがって、QNetworkAccessManagerのQT4.6でこれを実装したいと思います。
誰かがこれについて私を助けることができますか?
QNetworkAccessManagerでHTTPリクエストを別のスレッドで実行したい。現在、QT4.6では同じスレッドで実行されているため、ブラウザがハングします。この機能は最近QT4.8で導入されましたが、現在はQT4.8に切り替えることができません。したがって、QNetworkAccessManagerのQT4.6でこれを実装したいと思います。
誰かがこれについて私を助けることができますか?
あなたが望むことを達成するための2つ以上の方法があります。
まず、QNetworkAccessManagerを正しく使用していることを確認してください。デフォルトでは、次のようなHTTPリクエスト:
QNetworkAccessManager *manager= new QNetworkAccessManager(this);
manager->post(QNetworkRequest(QUrl("http://www.example.com/")));
非同期で作成されますが、これは必ずしもそれらが独自のスレッドにあることを意味するわけではありません。これらの呼び出しを大量に行うと、含まれているスレッドの速度が低下する可能性があります。
ここで、リクエストが別々のスレッドで行われるようにするために使用する1つの方法は、次のようにQNetworkAccessManagerのQObject/QWidget全体を作成することです。
(ヘッダ)
class Manager : public QWidget
{
Q_OBJECT
public:
Manager(QWidget *parent=0);
QNetworkAccessManager *manager;
private slots:
void replyFinished(QNetworkReply* data);
};
//... ... ...
//Later in the main thread declaration
//... ... ...
class MainBrowserWindow : public QWidget
{
//.... ... .. ..
//Other stuff for the main window
Manager managingWidget;
//this ensures that a new thread will be created and initialized
//alongside our MainBrowserWindow object (which is initialized in main.cpp)
};
(実装)
Manager::Manager(QWidget *parent): QWidget (parent){
//Initialize the widget here, set the geometry title and add other widgets
//I usually make this a QWidget so that it can double as a
//pop-up progress bar.
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
}
これで、メインウィンドウの実装から次のような呼び出しを使用してマネージャーオブジェクトを呼び出すことができます。
managingWidget.manager->post()
繰り返しになりますが、これは使用できる多くのメソッドの1つにすぎず、場合によっては、QNetworkAccessManagerが自動的に独自のスレッドにリクエストを配置します。ただし、これにより、オペレーティングシステムは、すべてのリクエストをメインスレッドとは別のスレッドに配置する必要があります。
Qtのスレッドについて読んで、処理する各URLのシグナルを受信する独自のスレッドを作成し、HTTP応答が処理されるときにメインスレッドにシグナルを返します。