过程信号和使用线程的插槽

时间:2012-01-13 21:20:34

标签: c++ multithreading qt

我需要能够发出请求GET请求,这需要使用信号来处理回复,并以处理过的形式返回回复。我按照Threading Wihtout the Headache中的描述构建了代码,但是当我运行时,回复从未被接收或处理过。

// Set-up request
QNetworkAccessManager* pConnection(new QNetworkAccessManager());
connect(pConnection,
       SIGNAL(finished(QNetworkReply*)),
       this,
       SLOT(process(QNetworkReply*)));
QUrl url;
url.setUrl(HOST);
url.addQueryItem("P1", "Hi");
url.addQueryItem("P2", "Bob");

// Send request
QNetworkRequest request(url);
pConnection->get(request);

// Wait for reply
QThread* pResponce(new QThread(this));
connect(this,
        SIGNAL(processingFinished()),
        pResponce,
        SLOT(quit()));
pConnection->moveToThread(pResponce);
pResponce->start();
pResponce->wait();
pConnection->deleteLater();
pResponce->deleteLater();
return this->processedReply;

显然我错过了什么,但是什么?它在我不使用线程(和删除)时有效,所以它不是URL或服务器。

1 个答案:

答案 0 :(得分:4)

如果你没有在其他线程中设置事件循环,只有main / gui线程会收到信号。

  

如果没有运行事件循环,则不会将事件传递给对象。例如,如果在线程中创建QTimer对象但从不调用exec(),则QTimer将永远不会发出其timeout()信号。调用deleteLater()也不起作用。 (这些限制也适用于主线程。)

来源:http://doc.qt.digia.com/4.6/threads-qobject.html

请参阅QThread::exec()这就是为什么你在链接QThreadEx类的例子中引入并使用了(不过你的代码snipplet!)......