我想让QNetworkAccessManager在单独的线程中运行HTTP请求。目前在QT4.6中,它是在同一线程中运行的,它导致我的浏览器挂起。这个特性是最近在Qt4.8中引入的,但现在我不能切换到Qt4.8。因此,我想在QNetworkAccessManager的Qt4.6中实现这一点。
有人能在这方面帮我吗?
发布于 2011-12-06 02:04:28
有很多种方法可以实现你想要的东西。
首先,确保您正确地使用了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会自动将请求放在它们自己的线程中。但这应该会迫使操作系统将所有请求放在一个独立于主线程的线程中。
发布于 2011-12-03 16:09:15
阅读有关threads in Qt的文章,并创建自己的线程,接收每个URL的信号以进行处理,并在处理HTTP回复时向主线程发出一些信号。
https://stackoverflow.com/questions/8366330
复制相似问题