2012-01-13 37 views
2

我需要能够发出请求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或服务器。

回答

4

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

如果没有事件循环正在运行,事件将不会传递到该对象。例如,如果你在一个线程中创建了一个QTimer对象,但是从不调用exec(),QTimer将永远不会发出它的timeout()信号。调用deleteLater()也不起作用。 (这些限制适用于主线程为好。)

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

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