我需要能够发出请求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或服务器。
答案 0 :(得分:4)
如果你没有在其他线程中设置事件循环,只有main / gui线程会收到信号。
如果没有运行事件循环,则不会将事件传递给对象。例如,如果在线程中创建QTimer对象但从不调用exec(),则QTimer将永远不会发出其timeout()信号。调用deleteLater()也不起作用。 (这些限制也适用于主线程。)
来源:http://doc.qt.digia.com/4.6/threads-qobject.html
请参阅QThread::exec()
。 这就是为什么你在链接QThreadEx类的例子中引入并使用了(不过你的代码snipplet!)......