使用线程处理信号和插槽

Process Signals & Slots Using a Thread

本文关键字:插槽 信号 处理 线程      更新时间:2023-10-16

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

如果不在其他线程中设置事件循环,则只有主/gui线程接收信号。

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

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

参见QThread::exec()这就是为什么在您链接的示例中引入并使用了QThreadEx类(但不是在您的代码snipplet中!)