如何知道计时器是不是已在 C 中结束
Posted
技术标签:
【中文标题】如何知道计时器是不是已在 C 中结束【英文标题】:How to know if a timer has ended in C如何知道计时器是否已在 C 中结束 【发布时间】:2013-11-06 04:22:19 【问题描述】:我需要能够同时启动多个计时器,并明确知道计时器是否已停止或仍在运行。
#define RESEND_TIMEOUT 5
void timerCreate();
void timer_start(timer_t * timer, uint32 timeout);
bool timer_complete(timer_t * timer);
int main()
timer_t resend_timer = timerCreate();
timer_start(&resend_timer, RESEND_TIMEOUT);
while(1)
if (timer_complete(&resend_timer))
break;
void timer_start(timer_t * timer, uint32_t timeout)
printf("timer starting\n");
struct itimerspec it_val;
it_val.it_value.tv_sec = timeout;
it_val.it_value.tv_nsec = 0;
// timer expires once
it_val.it_interval.tv_sec = 0;
it_val.it_interval.tv_nsec = 0;
if (timer_settime(*timer, 0, &it_val, NULL) == -1)
errExit("Could not set timeout");
// return true if timer ended
bool timer_complete(timer_t * timer)
if(timer_getoverrun(*timer) == 0)
return false;
else
return true;
我从不跳出循环。为什么我不能得到定时器的溢出(它总是返回0,这意味着定时器还没有过期)?然而,当我添加一个信号处理程序时,我知道计时器到期了。
我想在 timer_complete 函数中尝试 timer_gettime(timer_t timerid, struct itimerspec *curr_value) 以查看剩余时间是否为 0,但是如何在没有全局变量的情况下传递 curr_value 参数?
最后但并非最不重要的一点是,在使用 timer_settime 武装计时器时,我尝试使用 TIMER_ABSTIME 标志。从 int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value, struct itimerspec * old_value):
默认情况下,指定的初始过期时间 new_value->it_value 相对于当前时间解释 呼叫时计时器的时钟。这可以通过修改 在标志中指定 TIMER_ABSTIME,在这种情况下为 new_value->it_value 被解释为在定时器时钟上测量的绝对值; 即当时钟值达到该值时,定时器将超时 由 new_value->it_value 指定。如果指定的绝对时间有 已经过去了,那么计时器立即到期,并且超限 计数(参见 timer_getoverrun(2))将被正确设置。
【问题讨论】:
也许你想要timerfd_create(2) 和poll(2) 【参考方案1】:我从不跳出循环。为什么我不能得到定时器的溢出(总是返回0,表示定时器还没有过期)?
不,这意味着你没有超支。
即使您指定实时信号,操作系统也不会将计时器信号排队。 Overun 告诉您如果木夹头没有夹住信号,会有多少信号排队。
因此,假设您设置了一个计时器,使其每秒响一次。但是由于某种原因,您没有处理信号。假设您将其阻止了 5 秒钟。溢出计数将是 4 - 您将/正在处理的信号和您错过的 4。
在您的情况下,您设置了一个 一次性 计时器以在“超时”秒后关闭。信号被传递。将不再有信号,因此溢出始终为 0,因为它应该是。
【讨论】:
以上是关于如何知道计时器是不是已在 C 中结束的主要内容,如果未能解决你的问题,请参考以下文章