Как разрешить QNetworkAccessManager запускать HTTP-запросы в отдельном потоке - PullRequest
0 голосов
/ 03 декабря 2011

Я хочу, чтобы QNetworkAccessManager запускал HTTP-запросы в отдельном потоке. В настоящее время в QT4.6 он работает в том же потоке и вызывает зависание моего браузера. Эта функция недавно появилась в QT 4.8, но теперь я не могу перейти на QT 4.8. поэтому я хочу реализовать это в QT 4.6 для QNetworkAccessManager.

Может ли кто-нибудь помочь мне в этом?

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Существует более двух способов достичь желаемого.

Сначала убедитесь, что вы используете 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 автоматически помещает запросы в свой собственный поток.Но это должно заставить операционную систему разместить все ваши запросы в отдельном потоке от вашего основного потока.

0 голосов
/ 03 декабря 2011

Прочитайте о потоках в Qt и создайте свой собственный поток, который получает сигнал для каждого URL-адреса для обработки, и посылает некоторый сигнал обратно в основной поток при обработке ответа HTTP.

...