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