windows.h的sleep怎么用

老刘

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>

常见使用场景和写法

  1. 简单延时
    做倒计时、动画帧间隔、测试时临时卡一下,直接写 Sleep(毫秒数) 就够用。

  2. 循环里控制节奏
    比如每隔 1 秒打印一次时间:

for (int i = 0; i < 5; i++)
{
    printf("第 %d 次\n", i + 1);
    Sleep(1000);
}
  1. 配合消息循环或界面程序
    在界面程序里长时间 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.hSleep 了。纯 Windows 环境、追求最简单依赖的时候,还是 Sleep 最直接。

另外还有 SleepEx,支持可唤醒的休眠(配合 APC),普通延时场景用不到,这里就不展开了。

掌握上面这些,日常用 Sleep 已经完全够用。记住单位是毫秒、注意不要在界面主线程长时间阻塞,基本就不会踩坑。

文章版权声明:文章内容均来源于各大短视频平台搜集以及修改和删减新增,如有侵权或者违规,请联系站长进行删除,如需转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,1人围观)

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

目录[+]