1

我正在使用 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 的情况下工作?

顺便说一句,正在使用的 Qt 是使用 Carbon 框架 (qt4-mac) 构建的 macports 上的最新版本。

4

1 回答 1

0

可能需要定期打电话来QApplication::processEvents()完成工作。

于 2012-03-01T15:39:57.243 回答