例如,如果我想实现一个每秒执行代码的计时器,我可以使用 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(¤tTime) - previousTime) >= interval)
{
printf("%ldn", currentTime);
previousTime += interval;
}
}
return 0;
}
您可以根据需要更改interval
。现在,这并不能保证由于其他因素,printf
将在正好 interval
秒内执行。不过,这向您保证的是,每次执行printf
都不会随着时间的流逝而漂移。
请记住,做一个适当的间隔计时器比这个简单的解决方案更复杂。
我的建议是创建一个线程,该线程应该每秒将一些数据写入管道。
显然,线程的工作是每秒向管道添加一些日期。因此,使用 while 循环添加秒数据。
使用 可以使用 sleep(1) 或使用任何循环技术来计算时间。
在 main 函数中,将读取调用(用于读取管道)放在 while 循环中。
如果将某些内容读入管道,则表示已完成一秒钟。 然后在 while 循环中,您可以为您的任务添加代码。任务完成后,该过程将等待,直到它从管道读取。
您可以根据需要更改线程中的计时器,可以用作N秒计时器。
随着时间的完成,您的任务将主要开始。
我想这种技术可能会有所帮助。