如何允许QNetworkAccessManager在单独的线程中运行HTTP请求

时间:2011-12-03 07:38:36

标签: c++ qt qnetworkaccessmanager

我希望QNetworkAccessManager在单独的线程中运行HTTP请求。目前在QT4.6中它运行在同一个线程中,它导致我的浏览器挂起。 最近在QT 4.8中引入了此功能,但现在我无法切换到QT 4.8。因此,我想在QT 4.6中为QNetworkAccessManager实现这一点。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

有多种方法可以达到你想要的效果。

首先,确保正确使用QNetworkAccessManager。默认情况下为HTTP请求,例如:

QNetworkAccessManager *manager= new QNetworkAccessManager(this);
manager->post(QNetworkRequest(QUrl("http://www.example.com/")));

是异步制作的,但这不是必然意味着它们在自己的线程中。如果您进行了大量这些调用,则可以减慢包含线程的速度。

现在,我用来确保在不同线程中发出请求的一种方法是为我的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()

再一次,这只是您可能使用的众多方法之一,在某些情况下,QNetworkAccessManager会自动将请求放在自己的线程中。但这应该强制操作系统将所有请求放在与主线程分开的线程中。

答案 1 :(得分:0)

阅读threads in Qt,创建自己的线程,接收每个URL处理的信号,并在处理HTTP回复时向主线程发出一些信号。