问题描述:
在Qt的多线程中使用QNetworkAccessManager进行HTTP GET请求时,无法获取到响应。
解决方法:
为了避免多线程中产生的竞态条件,需要在每个线程中创建一个独立的QNetworkAccessManager实例。
在发送请求之前,需要将该请求移动到所属线程中。可以使用QObject::moveToThread()函数来实现。
在获取响应时,需要在所属线程中处理QNetworkReply的finished()信号,并调用QNetworkReply::readAll()函数获取响应数据。
下面是示例代码:
// WorkerThread.h
class WorkerThread : public QThread
{
Q_OBJECT
public:
explicit WorkerThread(QObject *parent = nullptr);
signals:
void requestFinished(const QByteArray& data);
protected:
void run() override;
};
// WorkerThread.cpp
WorkerThread::WorkerThread(QObject *parent)
: QThread(parent)
{
}
void WorkerThread::run()
{
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://example.com"));
QEventLoop loop;
QNetworkReply* reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [&]() {
emit requestFinished(reply->readAll());
reply->deleteLater();
loop.quit();
});
// move reply object to this thread
reply->moveToThread(this);
loop.exec();
}
在主线程中创建WorkerThread对象,连接requestFinished信号并启动线程即可:
WorkerThread* worker = new WorkerThread(this);
connect(worker, &WorkerThread::requestFinished, this, &MyClass::onRequestFinished);
worker->start();
在onRequestFinished中处理响应数据即可。