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() の後のイベント ループは決して quit() しません。また、常に0を返す別のスレッドからreply->bytesAvailable()にアクセスしようとしました。その理由は、親スレッドがブロックされた後にnamが動作するタイムスロットを取得できなかったQNetworkAccessManagerの並列メカニズムに関連している可能性があると思いますQEventLoop による。
イベント ループが Mac でのみブロックされる理由と、別の QThread を作成せずに QNetworkAccessManager を機能させるためにそのような問題を回避する方法を教えてください。
ところで、使用されている Qt は、Carbon フレームワーク (qt4-mac) で構築された macports の最新バージョンです。