QObject
我使用 Qt 4.8.5、Visual Studio 2010。我在派生对象(CGrabber 实例)中抓取了一些网页。m_reply 是一个类型为 的 CGrabber 成员QNetworkReply*
。当页面被下载时,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和reply以避免内存泄漏,防止grabber冻结呢?也许,我应该abort()
另外在某个地方调用或“关闭()”。如果遇到代理错误,有时我需要更改代理。另外,如果我想在run()
内打电话page_downloaded_slot()
,但回复显示错误(例如,reply->error() == QNetworkReply::ConnectionRefusedError
),我需要额外的步骤page_downloaded_slot()
吗?reply
和之间有什么联系m_reply
?