同个线程里,如果线程正在忙过程中,定时器时间到了会被延迟触发吗?

在同一线程中,如果线程正在忙过程中,定时器的触发事件会被延迟,直到线程空闲下来才会被触发。这是因为在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