You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:39:00