一、阻塞型延时(适用于非GUI线程)
线程休眠(`Thread.sleep`) 通过让当前线程暂停执行指定时间实现延时。适用于不需要更新UI的操作。
```java
new Thread(() -> {
try {
Thread.sleep(1000); // 延时1秒
// 延时执行的代码
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
```
`QThread::sleep`(Qt框架)
类似于Java的`Thread.sleep`,但需注意该函数会阻塞当前线程,导致界面卡死,建议仅在非GUI线程中使用。
二、非阻塞型延时(适用于需要响应的事件循环)
使用事件循环机制
通过强制刷新事件循环实现延时,避免界面卡死。例如在Qt中,可以使用`QCoreApplication::processEvents`:
```cpp
void DelayMs(unsigned int msec) {
QTime timer = QTime::currentTime().addMSecs(msec);
while (QTime::currentTime() < timer) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
}
```
适用于需要定期处理事件或更新UI的场景。
定时器(`QTimer`)
提供灵活的延时机制,可绑定到信号与槽,适合GUI应用中的定时任务。
```cpp
QTimer timer;
connect(&timer, &QTimer::timeout, this, &YourClass::onTimeout);
timer.start(1000); // 延时1秒
```
三、硬件延时(适用于嵌入式系统)
在单片机等硬件平台中,常通过循环指令实现延时:
```c
void Delay10us() {
__NOP__(6); // 每个NOP占1μs,共需10μs
}
```
需注意:
延时函数需根据CPU频率调整NOP数量;
嵌入式系统建议使用硬件定时器以降低功耗。
四、注意事项
线程安全:
- 避免在主线程中直接调用`Thread.sleep`,需使用`Handler.postDelayed`或`Timer`;
- 嵌入式系统需注意任务调度与硬件资源限制。
精度问题:
- 软件延时受系统负载影响,实际延时可能略长于设定值;
- 硬件延时(如`mSleep`)精度较高,但需注意系统时钟同步。
替代方案:
- 对于高精度需求,可结合硬件定时器与软件中断实现;
- 实时系统建议使用实时操作系统(RTOS)提供的延时机制。
以上方法可根据具体需求选择,例如:
非GUI后台处理:线程休眠或定时器;
GUI界面更新:事件循环或`Handler.postDelayed`;
嵌入式系统:硬件定时器或RTOS调度。