windows.h 的 Sleep 怎么用
很多刚接触 Windows 编程的朋友,想让程序暂停一会儿再继续执行,第一反应就是去找 sleep。Windows 下最常用、最直接的方式,就是通过 <windows.h> 提供的 Sleep 函数。
什么是 Sleep
Sleep 是 Windows API 提供的线程休眠函数。调用后,当前线程会进入睡眠状态,指定的时间到了之后再自动醒来继续往下跑。它只影响当前线程,不会把整个进程卡死(除非你只有一个线程)。
函数原型很简单:
void Sleep(DWORD dwMilliseconds);
参数 dwMilliseconds 表示要休眠的毫秒数。传 1000 就是停 1 秒,传 500 就是停 0.5 秒。传 0 的效果比较特殊,相当于主动让出当前时间片,让系统调度其他线程。
最基本的用法
先把头文件包含进来,然后直接调用就行。下面是一个最简单的例子:
#include <windows.h>
#include <stdio.h>
int main()
{
printf("开始休眠 3 秒...\n");
Sleep(3000); // 休眠 3000 毫秒 = 3 秒
printf("休眠结束,继续执行\n");
return 0;
}
编译运行后,你会先看到第一行输出,然后程序卡住 3 秒,最后再打印第二行。
如果是 C++ 项目,写法完全一样,只需要把文件后缀改成 .cpp,头文件照样用 <windows.h>。
常见使用场景和写法
-
简单延时
做倒计时、动画帧间隔、测试时临时卡一下,直接写Sleep(毫秒数)就够用。 -
循环里控制节奏
比如每隔 1 秒打印一次时间:
for (int i = 0; i < 5; i++)
{
printf("第 %d 次\n", i + 1);
Sleep(1000);
}
- 配合消息循环或界面程序
在界面程序里长时间Sleep会让界面卡住(因为主线程被阻塞了)。这时更推荐用定时器(SetTimer)或者把耗时操作放到子线程里再Sleep。
需要注意的几个点
-
精度问题
Sleep的实际休眠时间通常会略大于你指定的值,受系统时钟精度和调度影响。Windows 默认时钟精度大约是 15.6 毫秒左右,所以Sleep(1)实际可能睡到十几毫秒。如果你需要更精确的延时,可以先调用timeBeginPeriod(1)提高系统时钟精度(用完记得timeEndPeriod(1)),但不要滥用。 -
传 0 的特殊含义
Sleep(0)不会真正休眠,而是立即把当前时间片让给其他就绪线程。适合在忙等循环里降低 CPU 占用。 -
不要在主线程长时间 Sleep
控制台程序问题不大,带窗口的 GUI 程序长时间阻塞主线程会导致界面无响应。耗时操作请放到工作线程。 -
和 C 标准库 sleep 的区别
Linux 下的sleep单位是秒,Windows 的Sleep单位是毫秒,而且大小写不同。跨平台代码里不要直接混用。 -
头文件依赖
只包含<windows.h>就够了。有些人会先包含<WinBase.h>,其实没必要,<windows.h>已经把相关声明都带进来了。
进阶一点的写法
如果你用的是 C++11 或更高版本,也可以考虑标准库的方式,跨平台更友好:
#include <thread>
#include <chrono>
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
但这已经不是 windows.h 的 Sleep 了。纯 Windows 环境、追求最简单依赖的时候,还是 Sleep 最直接。
另外还有 SleepEx,支持可唤醒的休眠(配合 APC),普通延时场景用不到,这里就不展开了。
掌握上面这些,日常用 Sleep 已经完全够用。记住单位是毫秒、注意不要在界面主线程长时间阻塞,基本就不会踩坑。

还没有评论,来说两句吧...