我需要能夠同時啓動多個定時器,並明確知道定時器是否已停止或仍在運行。啓動多個定時器並知道哪一個已經結束C
#define RESEND_TIMEOUT 5
void timer_set_timeout(timer_t * timer, uint32_t timeout);
void timer_start(timer_t * timer);
bool timer_complete(timer_t * timer);
void signal_handler(int sig, siginfo_t *si, void *uc);
int main() {
timer_t resend_timer;
printf("starting timer\n");
timer_start(&resend_timer);
timer_set_timeout(RESEND_TIMEOUT);
while(1) {
if (timer_complete(&resend_timer))
break;
}
}
void timer_set_timeout(timer_t * timer, uint32_t timeout)
{
struct itimerspec it_val;
it_val.it_value.tv_sec = timeout;
it_val.it_value.tv_nsec = 0;
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");
}
}
void timer_start(timer_t * timer)
{
struct sigaction sa;
struct sigevent sev;
// establish signal handler
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = signal_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(SIG, &sa, NULL) == -1)
errExit("Failed to establish signal handler");
// create timer
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIG;
sev.sigev_value.sival_ptr = timer;
if(timer_create(CLOCK_MONOTONIC, &sev, timer) == -1) {
errExit("Could not start timer");
}
}
// return true if timer ended
bool timer_complete(timer_t * timer)
{
if(timer_getoverrun(*timer) == 0)
return false;
else
return true;
}
void signal_handler(int sig, siginfo_t *si, void *uc)
{
printf("Timer ran out!\n");
signal(sig, SIG_IGN);
}
信號處理程序運行5秒後,但我無法知道計時器是否已結束或不使用timer_complete。我試過了:int timer_gettime(timer_t timerid,struct itimerspec * curr_value) 但我不知道curr_value傳遞什麼。我試過聲明一個itimerspec,但它的結果與getoverrun相同。
我也試過用timer_settime的標誌TIMER_ABSTIME,但定時器由於某種原因立即失效。
沒有必要測試間隔字段。 timer_settimer(3)說:「如果new_value-> it_value指定一個零值(即兩個子字段均爲零),那麼定時器將被撤防。」 – ValenceElectron