使用QNetworkAccessManager重新运行get请求

时间:2013-09-10 04:50:01

标签: qt qnetworkaccessmanager

我使用Qt 4.8.5,Visual Studio 2010.我在QObject派生对象(CGrabber实例)中抓取了一些网页。 m_reply是一个类型为QNetworkReply*的CGrabber成员。下载页面时,page_downloaded_slot()会对其进行处理。我转到下一个URL并致电run()下载另一个页面。有时候qDebug()会显示m_replyisRunning()为真(虽然我打电话给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()中的其他步骤? replym_reply之间的链接是什么?

0 个答案:

没有答案