2012-02-29 30 views
1

我正在爲使用Qt 4.7.4的QtNetwork編寫VLC 2.0的HTTP訪問模塊。我的代碼片段如下:QNetworkAccessManager中的並行機制是什麼?

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框架(QT4-MAC)的MacPorts內置的最新版本。

回答

0

可能必須定期致電QApplication::processEvents()才能完成工作。