簡體   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