在多個線程中使用QNetworkAccessManager

來源:互聯網
上載者:User

標籤:nal   ssm   pos   repo   文檔   manage   object   不同   mon   

最近發現Tangram發出了URL request, 但是卻收不到URL reponse

經研究後發現這是一個線程問題: Tangram會在多個線程發送URL request, 但是在實現時, 卻沒有考慮線程問題, 程式在運行時得到如下warning:

 

QObject: Cannot create children for a parent that is in a different thread.(Parent is QNetworkAccessManager(0x21dcba0), parent‘s thread is QThread(0x20be1c0), current thread is QThread(0x7f48e0044730)

 

在移植Tangram到Qt平台時, 網路請求使用的是QNetworkAccessManager, QNetworkAccessManager的使用很簡單:

 

  QNetworkAccessManager *manager = new QNetworkAccessManager(this);  connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));  manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

 

這裡碰到的問題是:Tangram可能在多個線程發送URL, 但是QNetworkAccessManager只能在產生它所在的線程中工作, 解決辦法是使用Qt的SIGNAL/SLOT機制, 把該URL request post到正確的線程中:

class URLTaskWorker{public:    URLTaskWorker(){        connect(this,SIGNAL(startRequest()),this, SLOT(onRequest()), Qt::QueuedConnection);    }public:    void handleTask(QUrl url){        this->url = url;        emit StartNewRequest();    }signals:    void startRequest();    private slots:    void onRequest(){        qnam.get(url);    }private:    QNetworkAccessManager   qnam;    QUrl                    url;};

 

這裡要注意的是, 在connect startRequest和onRequest時, 要使用Qt::QueuedConnection, 使用預設的Qt::AutoConnection不工作, 參考Qt協助文檔:

Qt::QueuedConnectionThe slot is invoked when control returns to the event loop of the receiver‘s thread. The slot is executed in the receiver‘s thread.

這也是一個Qt的安全執行緒的在不同線程間傳遞訊息的方法。

 

在多個線程中使用QNetworkAccessManager

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.