QT 关于程序延时的几种处理方法

本文详细介绍了在Qt中实现延时的两种主要方法:阻塞型和非阻塞型。阻塞型延时通过QThread系列函数实现,但会导致GUI线程卡死。非阻塞型延时则利用事件循环,保持GUI响应,适用于单线程带UI程序,包括处理本线程事件循环和使用子事件循环两种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、阻塞型延时

阻塞的原理:在延时期间,本线程的事件循环得不到执行。

<1>:
多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。这几个函数带来的不良效果就是:GUI会在延时的时间段内失去响应,界面卡死。所以,这三个函数一般用在非GUI线程中。

<2>:

void sleep_msec(int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
    {
        //如果去掉QCoreApplication::processEvents; 可以延时,但会阻塞线程
        //QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    }
}

2、非阻塞型延时

原理就是利用事件循环,也有两种方式:

<1>、处理本线程的事件循环

///
/// \brief sleep_msec
/// \param msec
/// \note 这种方法不会阻塞当前线程,尤其适合Qt单线程带UI程序
void sleep_msec(int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
    {
        //强制进入当前线程的事件循环,这样可以把堵塞的事件都处理掉,从而避免程序卡死。
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
        //如果去掉QCoreApplication::processEvents; 可以延时,但会阻塞线程
    }
}

<2>、使用子事件循环

///
/// \brief delay_msec
/// \param msec
/// \note 创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的,该方法不会阻塞线程
void delay_msec(unsigned int msec)
{
    //定义一个新的事件循环
    QEventLoop loop;
    //创建单次定时器,槽函数为事件循环的退出函数
    QTimer::singleShot(msec, &loop, SLOT(quit()));
    //事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
    loop.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值