windows下用sleep()实现毫秒级延时,需包含windows.h,参数为毫秒,但精度受系统调度影响且线程完全挂起;跨平台推荐c++11的std::this_thread::sleep_for(),需和,注意单位与编译标准。

Windows 下用 Sleep() 实现毫秒级延时
Windows API 提供的 Sleep() 是最直接的延时方式,头文件为 Windows.h,参数单位是毫秒,传入 0 会让出当前时间片但不真正休眠。
- 必须链接
kernel32.lib(VS 默认已链接,一般不用手动加) - 注意函数名大小写:
Sleep()不是sleep()或sleeP(),否则链接失败报LNK2019 - 延时精度受系统调度影响,实际休眠时间可能比指定值多几毫秒,不适合高精度定时场景
- 调用期间线程完全挂起,无法响应信号或中断(比如 Ctrl+C 在延时期间不会触发)
#include <Windows.h>
int main() {
Sleep(1000); // 暂停 1 秒
return 0;
}
跨平台用 std::this_thread::sleep_for()
C++11 起标准库提供可移植方案,依赖 <thread></thread> 和 <chrono></chrono>,推荐用于新项目。
- 需确保编译器支持 C++11 或更高(如 g++ -std=c++11),否则报
‘this_thread’ is not a member of ‘std’ - 时间单位用
std::chrono类型表达,例如std::chrono::seconds(2)、std::chrono::milliseconds(500) - 该函数可能被信号中断(POSIX 系统上),返回后需检查是否真休眠完成;Windows 上通常不会被中断,但标准不保证
- 不要在单线程中滥用——频繁调用小间隔(如
sleep_for(1ms))会显著增加调度开销
#include <thread>
#include <chrono>
int main() {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
return 0;
}
Linux/macOS 下慎用 usleep() 和 nanosleep()
usleep() 已被 POSIX 标准废弃,nanosleep() 是更现代替代,但两者都只在类 Unix 系统可用,且行为有细节差异。
-
usleep(1000)表示 1000 微秒(即 1 毫秒),不是毫秒——容易误写成usleep(1000)想休眠 1 秒,结果只休眠 1ms -
nanosleep()接收struct timespec*,需手动构造,且可能被信号中断并返回-1+errno == EINTR,必须检查并重试 - glibc 在 2.2.2+ 版本中将
usleep()实现为对nanosleep()的封装,但语义不一致,不建议新代码使用 - 若必须用,记得包含
<unistd.h></unistd.h>(usleep)或<time.h></time.h>(nanosleep)
延时中想响应用户输入?别用阻塞式 sleep
如果程序需要“延时 3 秒,但期间能按任意键退出”,就不能直接调用 Sleep() 或 sleep_for()——它们会锁死线程,键盘事件无法捕获。
立即学习“C++免费学习笔记(深入)”;
- Windows 可用
WaitForSingleObject()配合CreateEvent()+SetEvent()实现可中断等待,再结合PeekConsoleInput() - Linux/macOS 可用
select()或pselect()监听stdin文件描述符,配合clock_gettime()手动轮询计时 - 更简单但略重的方式:开一个
std::thread执行延时逻辑,主线程保持输入监听,用std::atomic_bool或std::condition_variable通信 - GUI 或游戏循环中,应完全避免 sleep,改用帧率控制或事件驱动模型
Sleep()、POSIX 的 nanosleep()、C++ 标准的 sleep_for() 在中断行为、精度、单位、头文件依赖上全都不一样——选错一个,轻则延时不准,重则编译失败或信号丢失。










