同個執行緒裡,如果執行緒正在忙過程中,定時器時間到了會被延遲觸發嗎?

不知云深处發表於2024-03-10

同個執行緒裡,如果執行緒正在忙過程中,定時器時間到了會被延遲觸發嗎?

在同一執行緒中,如果執行緒正在忙過程中,定時器的觸發事件會被延遲,直到執行緒空閒下來才會被觸發。這是因為在QT中,執行緒和定時器的處理都是透過事件迴圈來完成的。當執行緒處於忙碌狀態時,事件迴圈將會被阻塞,直到執行緒執行完當前的工作才會繼續執行事件迴圈,處理定時器的觸發事件。

舉個例子,假設我們在同一執行緒中建立了一個定時器,並將其定時器時間設定為1秒。隨後,我們線上程中模擬了一個耗時操作,例如迴圈輸出一些資訊,並在每次迴圈結束後呼叫QThread::sleep()函式,以模擬執行緒正在執行某些耗時操作。在這種情況下,如果定時器的觸發時間與執行緒忙碌的時間重疊,那麼定時器的觸發事件將會被延遲,直到執行緒執行完當前的工作才會被觸發。

下面是一個簡單的示例程式碼,演示了在同一執行緒中,當執行緒處於忙碌狀態時,定時器的觸發會被延遲的情況:

#include <QCoreApplication>
#include <QThread>
#include <QTimer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTimer timer;
    connect(&timer, &QTimer::timeout, [](){
        qDebug() << "Timer triggered in thread";
    });
    timer.start(1000);

    for (int i = 0; i < 10; ++i) {
        qDebug() << "Thread working" << i;
        QThread::sleep(1);
    }

    return a.exec();
}

在這個例子中,我們建立了一個定時器,並將其定時器時間設定為1秒。隨後,我們模擬了一個耗時操作,在迴圈中輸出一些資訊,並在每次迴圈結束後呼叫QThread::sleep()函式,以模擬執行緒正在執行某些耗時操作。在程式執行時,我們可以看到在執行緒處於忙碌狀態時,定時器的觸發事件會被延遲,直到執行緒執行完當前的工作才會被觸發。

輸出結果

Thread working 0
Thread working 1
Thread working 2
Thread working 3
Thread working 4
Thread working 5
Thread working 6
Thread working 7
Thread working 8
Thread working 9
Timer singleShot triggered in thread
Timer triggered in thread
Timer triggered in thread

相關文章