首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何允许QNetworkAccessManager在独立线程中运行HTTP请求

如何允许QNetworkAccessManager在独立线程中运行HTTP请求
EN

Stack Overflow用户
提问于 2011-12-03 15:38:36
回答 2查看 4.2K关注 0票数 0

我想让QNetworkAccessManager在单独的线程中运行HTTP请求。目前在QT4.6中,它是在同一线程中运行的,它导致我的浏览器挂起。这个特性是最近在Qt4.8中引入的,但现在我不能切换到Qt4.8。因此,我想在QNetworkAccessManager的Qt4.6中实现这一点。

有人能在这方面帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-06 02:04:28

有很多种方法可以实现你想要的东西。

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

代码语言:javascript
复制
QNetworkAccessManager *manager= new QNetworkAccessManager(this);
manager->post(QNetworkRequest(QUrl("http://www.example.com/")));

是异步执行的,但这并不一定意味着它们在自己的线程中。如果你进行大量这样的调用,你可能会减慢包含线程的速度。

现在,我用来确保请求在单独的线程中发出的一种方法是为我的QNetworkAccessManager创建一个完整的QObject/QWidget,如下所示:

(表头)

代码语言:javascript
复制
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)

};

(实现)

代码语言:javascript
复制
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*)));
}

现在,您可以从主窗口的实现中调用管理器对象,方法如下:

代码语言:javascript
复制
managingWidget.manager->post()

同样,这只是您可能使用的众多方法中的一个,在某些情况下,QNetworkAccessManager会自动将请求放在它们自己的线程中。但这应该会迫使操作系统将所有请求放在一个独立于主线程的线程中。

票数 1
EN

Stack Overflow用户

发布于 2011-12-03 16:09:15

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8366330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档