QNetworkAccessManager中的并行化机制是什么?

时间:2012-02-29 21:24:23

标签: c++ macos qt vlc qnetworkaccessmanager

我正在使用Qt 4.7.4中的QtNetwork为VLC 2.0编写HTTP访问模块。我的代码剪辑如下:

static int Open(vlc_object_t *p_this)
{
  ....
  QNetworkAccessManager *nam = new QNetworkAccessManager;
  QNetworkReply *reply = nam->get(QNetworkRequest("http://stackoverflow.com/"));
  Q_ASSERT(reply);

  QEventLoop loop;
  connect(reply, SIGNAL(finished()), &loop, SLOT(quit());
  connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
  connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit()));
  loop.exec(); // -- BLOCKED HERE in Lion
  ....
}

相同的代码在Windows 7上运行良好,但在OS X Lion上会被阻止。 exec()之后的事件循环永远不会退出()。我也尝试从另一个线程访问reply-> bytesAvailable(),它总是返回0.我猜这个原因可能与QNetworkAccessManager中的并行机制有关,当nam无法在父线程之后获得任何时隙工作时被QEventLoop阻止。

有人可以给我一些建议,为什么事件循环只会在Mac上被阻止,我可以做些什么来绕过这样的问题,使QNetworkAccessManager无需创建另一个QThread即可工作?

BTW,正在使用的Qt是使用Carbon framework(qt4-mac)构建的macport上的最新版本。

1 个答案:

答案 0 :(得分:0)

可能必须定期拨打QApplication::processEvents()来完成工作。