繁体   English   中英

Qt 在另一个线程中无限循环

[英]Qt infinite loop in another thread

我正在尝试在另一个线程中设置无限循环。 目的是从 URL 下载一些数据,将数据发送到主线程并休眠几秒钟:

DataFetcher::DataFetcher(QUrl url, int fetchRateSec) :
    url {url},
    fetchRateSec {fetchRateSec}
{

}

void DataFetcher::run()
{
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    QObject::connect(manager, &QNetworkAccessManager::finished, this, &DataFetcher::onReply);

    while (true) {
        QNetworkRequest req;
        req.setUrl(url);
        manager->get(req);
        qDebug() << "run";
        sleep(fetchRateSec);
    }
}


void DataFetcher::onReply(QNetworkReply* reply)
{
    qDebug() << "repl";
    emit fetched(reply->readAll());
}

class DataFetcher : public QThread
{
    Q_OBJECT
public:
    DataFetcher(QUrl, int);
    void run() override;
signals:
    void fetched(QString);
private:
    const QUrl url;
    const int fetchRateSec;   
private slots:
    void onReply(QNetworkReply*);
};

但永远不会调用onReply

有趣的是, while循环中的qDebug会按原样执行。

我对 QT 有点不满意,所以我可能错过了有关如何连接插槽/信号的一些内容,但我认为我在其他一些示例之后得到了它。

它看起来与How do I write a Qt HTTP GET request?

这里可能是什么问题?

根据评论中的讨论,似乎不需要整个线程业务。

Qt 最强大的属性之一是它是事件驱动的。 您通常通过描述您想要发生的事情()来响应某些事件(信号)来创建程序。 显式等待或休眠在基于 Qt 的应用程序中非常罕见(通常仅用于测试),并且通常被认为是事件驱动开发中的禁忌。

对于您的特定问题,解决方案可能如下所示。 您可以在主线程中创建一个QTimer并将其超时信号连接到 function 以发出您的 HTTP 请求。 然后,您可以将插槽连接到QNetworkAccessManager::finished信号,该信号将在您的响应完成时运行。 所有这些都可以在主线程中进行,依靠线程的事件循环来管理回调。 不需要自己管理单独的线程,也不需要循环、休眠、阻塞或类似的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM