如何用C语言开发无需手动刷新、不阻塞的实时数字时钟?
实现非阻塞实时数字时钟的几种方案
方案1:主循环轮询(最简单,适合小型控制台程序)
所有程序逻辑放在同一个主循环内,每次循环先判断是否间隔1秒,满足就更新时钟,再执行其他业务逻辑,不会出现阻塞。
- 不要自己维护时分秒计数,直接调用系统
time()接口获取最新时间,避免长时间运行出现计时误差 - 不用清屏,直接移动控制台光标到行首覆盖输出,不会出现闪屏问题
示例代码:
#include <stdio.h> #include <time.h> #include <windows.h> // 更新时钟的函数,每次调用就刷新最新时间显示 void update_clock() { time_t t = time(NULL); struct tm tm = *localtime(&t); const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"}; // \r 直接回到行首覆盖输出,不用清屏 printf("\r%02d %s, %d %02d:%02d:%02d %s", tm.tm_mday, months[tm.tm_mon], tm.tm_year + 1900, tm.tm_hour % 12 == 0 ? 12 : tm.tm_hour % 12, tm.tm_min, tm.tm_sec, tm.tm_hour >= 12 ? "PM" : "AM" ); fflush(stdout); } int wmain(void) { time_t last_update = 0; while(1) { time_t now = time(NULL); // 每隔1秒更新一次时钟 if (now - last_update >= 1) { update_clock(); last_update = now; } // 这里放你程序的其他业务逻辑,比如响应用户输入、其他功能执行 // 示例:检测用户按q退出 if (GetAsyncKeyState('Q') & 0x8000) { break; } // 加10ms休眠降低CPU占用 Sleep(10); } return 0; }
方案2:多线程实现(适合程序逻辑复杂的场景)
把时钟更新逻辑放到独立的子线程运行,主线程处理其他业务逻辑,两者互不干扰。Windows下可以用CreateThread,Linux下用pthread_create创建线程。
方案3:系统定时器(适合GUI或带消息循环的程序)
Windows平台可以调用SetTimer注册1秒间隔的定时器,系统会自动按时发送WM_TIMER消息,你在消息回调里更新时钟即可,不需要自己维护循环逻辑。
内容的提问来源于stack exchange,提问作者Ali Elneklawy
相关产品推荐
相关产品推荐

