我使用Qt 4.8.5,Visual Studio 2010.我在QObject
派生对象(CGrabber实例)中抓取了一些网页。 m_reply是一个类型为QNetworkReply*
的CGrabber成员。下载页面时,page_downloaded_slot()
会对其进行处理。我转到下一个URL并致电run()
下载另一个页面。有时候qDebug()
会显示m_reply
有isRunning()
为真(虽然我打电话给deleteLater)。这就是下载下一页冻结的原因。第一次run()
来电是在page_downloaded_slot()
之外进行的。
void CGrabber::page_downloaded_slot( QNetworkReply* reply )
{
//pseudocode
if (some_condition)
{
reply->deleteLater();
//get the next URL
run();
return;
}
reply->deleteLater();
}
void CGrabber::run()
{
QObject::connect(m_net_manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(page_downloaded_slot(QNetworkReply*)));
// m_reply can be running here
m_reply = m_net_manager->get(QNetworkRequest(/*current URL*/));
}
那么,我应该如何处理m_reply并回复以避免内存泄漏,防止抓取器冻结?也许,我应该在某处另外调用abort()
或'close()'。如果遇到代理错误,有时我需要更改代理。另外,如果我想在run()
内拨打page_downloaded_slot()
,但回复显示错误(例如reply->error() == QNetworkReply::ConnectionRefusedError
),我是否需要page_downloaded_slot()
中的其他步骤? reply
和m_reply
之间的链接是什么?