Каков механизм распараллеливания в QNetworkAccessManager?

Я пишу модуль доступа HTTP для VLC 2.0, используя QtNetwork из Qt 4.7.4. Мои фрагменты кода следуют:

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() никогда не выходит(). Я также пытался получить доступ к answer->bytesAvailable() из другого потока, который всегда возвращал 0. Я предполагаю, что причина может быть связана с параллельным механизмом в QNetworkAccessManager, когда nam не мог заставить работать какие-либо временные интервалы после того, как родительский поток был заблокирован. по QEventLoop.

Может ли кто-нибудь дать мне несколько предложений, почему цикл событий блокируется только на Mac, и что я могу сделать, чтобы обойти эту проблему, чтобы заставить QNetworkAccessManager работать без создания другого QThread?

Кстати, используемый Qt — это последняя версия macport, созданная с использованием фреймворка Carbon (qt4-mac).


person jichi    schedule 29.02.2012    source источник


Ответы (1)


Вам возможно придется периодически звонить QApplication::processEvents(), чтобы выполнить работу.

person buster    schedule 01.03.2012