Я пишу модуль доступа 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).