[英]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.