QT开发中文网

Qt多线程内使用HTTPQNetworkReply get方式无法获取到响应

问题描述:

在Qt的多线程中使用QNetworkAccessManager进行HTTP GET请求时,无法获取到响应。

解决方法:

  1. 为了避免多线程中产生的竞态条件,需要在每个线程中创建一个独立的QNetworkAccessManager实例。

  2. 在发送请求之前,需要将该请求移动到所属线程中。可以使用QObject::moveToThread()函数来实现。

  3. 在获取响应时,需要在所属线程中处理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中处理响应数据即可。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=764

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?