0

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

4

0 回答 0