我正在尝试在另一个线程中设置无限循环。目的是从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
从来没有叫过。
有趣的qDebug
是,while
循环中的in会按原样执行。
我对QT有点不满意,所以我可能错过了一些有关如何连接插槽/信号的信息,但是我认为我在遵循其他一些示例后还是正确的。
从如何编写Qt HTTP GET请求中的已接受答案中可以看出来。
这可能是什么问题?
根据评论中的讨论,似乎不需要整个线程。
Qt最强的特性之一是它是事件驱动的。通常,您通过描述想要响应某些事件(信号)发生的事情(插槽)来创建程序。在基于Qt的应用程序中(通常仅用于测试),明确地等待或休眠是非常少见的,并且在事件驱动的开发中通常认为不可以。
对于您的特定问题,解决方案可能如下所示。您可以QTimer
在主线程中创建一个并将其超时信号连接到一个函数以发出HTTP请求。然后,您可以将插槽连接到QNetworkAccessManager::finished
signal,当您的响应完成时该插槽将运行。所有这些都可以在主线程中进行,这取决于线程的事件循环来管理回调。无需自己管理单独的线程,也无需循环,休眠,阻塞或类似操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句