C语言 如何使用 time(NULL) 和 while 循环而不是睡眠 (N) 实现 N 秒计时器



例如,如果我想实现一个每秒执行代码的计时器,我可以使用 sleep(1):

#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main(){
    while(1){
        printf("%ldn",time(NULL));
        fflush(stdout);
        sleep(1);
    }
    return 0;
}

但是 sleep(1) 和其他代码的总经过时间实际上可能超过 1 秒,所以我使用 while 循环代替:

#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main(){
    time_t t=0;
    while(1){
        if(t!=time(NULL)){
            t=time(NULL);
            printf("%ldn",t);
        }
    }
    return 0;
}

但问题是,在这个程序中,循环中的代码每秒执行一次,如果我想每 N 秒(例如:3,4...)执行代码怎么样?

我试过了,但没有效果:

#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main(){
    time_t t=0;
    while(1){
        if((t-time(NULL))%3==0){
            t=time(NULL);
            printf("%ldn",t);
        }
    }
    return 0;
}

它在循环中多次执行代码,直到传递 %3==0 的第二个。

我应该如何修改它?或者换句话说,使用这种方法实现计时器 N 秒的一般解决方案是什么?

只是尝试修复您的代码,您可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv)
{
    time_t previousTime = time(NULL);
    time_t interval = 3;
    time_t currentTime;
    while(1)
    {
        if((time(&currentTime) - previousTime) >= interval)
        {
            printf("%ldn", currentTime);
            previousTime += interval;
        }
    }
    return 0;
}

您可以根据需要更改interval。现在,这并不能保证由于其他因素,printf将在正好 interval 秒内执行。不过,这向您保证的是,每次执行printf都不会随着时间的流逝而漂移。

请记住,做一个适当的间隔计时器比这个简单的解决方案更复杂。

我的建议是创建一个线程,该线程应该每秒将一些数据写入管道。

显然,线程的工作是每秒向管道添加一些日期。因此,使用 while 循环添加秒数据。

使用 可以使用 sleep(1) 或使用任何循环技术来计算时间。

在 main 函数中,将读取调用(用于读取管道)放在 while 循环中。

如果将某些内容读入管道,则表示已完成一秒钟。 然后在 while 循环中,您可以为您的任务添加代码。任务完成后,该过程将等待,直到它从管道读取。

您可以根据需要更改线程中的计时器,可以用作N秒计时器。

随着时间的完成,您的任务将主要开始。

我想这种技术可能会有所帮助。

最新更新