Существует более двух способов достичь желаемого.
Сначала убедитесь, что вы используете QNetworkAccessManager правильно.По умолчанию запросы HTTP, такие как:
QNetworkAccessManager *manager= new QNetworkAccessManager(this);
manager->post(QNetworkRequest(QUrl("http://www.example.com/")));
, выполняются асинхронно, но это не обязательно означает, что они находятся в своем собственном потоке.Если вы сделаете несколько таких вызовов, вы сможете замедлить поток, в котором они содержатся.
Теперь, один из способов, который я использую, чтобы убедиться, что запросы выполняются в отдельных потоках, - это создание всего QObject./ QWidget для моего QNetworkAccessManager, например:
(Заголовок)
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()
Еще раз, это только один из многих методов, которые вы можете использовать, и в некоторых случаях QNetworkAccessManager автоматически помещает запросы в свой собственный поток.Но это должно заставить операционную систему разместить все ваши запросы в отдельном потоке от вашего основного потока.