我希望QNetworkAccessManager在单独的线程中运行HTTP请求。目前在QT4.6中它运行在同一个线程中,它导致我的浏览器挂起。 最近在QT 4.8中引入了此功能,但现在我无法切换到QT 4.8。因此,我想在QT 4.6中为QNetworkAccessManager实现这一点。
有人可以帮我吗?
答案 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回复时向主线程发出一些信号。