【问题标题】:Counting time with timer in C用C中的计时器计算时间
【发布时间】:2019-09-04 02:47:16
【问题描述】:

我想在特定时间段内运行 C 程序。在这段时间之后,程序应该被终止。我搜索了一些关于它的文档,但其中许多使用sleep 函数。我不想用它。我想在无限循环中检查当前时间是否大于目标时间。

例如下面的代码,我的目标时间是5,当运行时间大于5时,程序应该终止。

但代码会导致无限循环。我该如何解决这个问题?

void thread_handler(union sigval sv) {
    char *s = sv.sival_ptr;
    /* Will print "5 seconds elapsed." */
    puts(s);
}

int main(void) {
    char info[] = "5 seconds elapsed.";
    timer_t timerid;
    struct sigevent sev;
    struct itimerspec trigger;
    struct itimerspec triggerAfter;

    memset(&sev, 0, sizeof(struct sigevent));
    memset(&trigger, 0, sizeof(struct itimerspec));

    sev.sigev_notify = SIGEV_THREAD;
    sev.sigev_notify_function = &thread_handler;
    sev.sigev_value.sival_ptr = &info;

    timer_create(CLOCK_REALTIME, &sev, &timerid);

    trigger.it_value.tv_sec = 5;

    timer_settime(timerid, 0, &trigger, NULL); 

    timer_gettime(timerid,&trigger);
    while (1) {
        if ((int)trigger.it_value.tv_sec > 5) { //checking the current time is bigger than the target time, it it is then exit from the program
            timer_delete(timerid);
            exit(0);
        }
    }
}

【问题讨论】:

    标签: c time timer posix


    【解决方案1】:

    如果你想在繁忙的循环中检查和比较,你可以简单地调用clock_gettime 并完全避免计时器。 计时器的全部意义在于避免这种繁忙的循环。

    在您的情况下,您的主线程可以简单地暂停,您可以退出运行的 thread_handler 函数 在计时器处理程序的专用线程上。

    #include <time.h>
    #include <signal.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    void thread_handler(union sigval sv) {
        char *s = sv.sival_ptr;
        /* Will print "5 seconds elapsed." */
        puts(s);
        exit(0);
    }
    
    int main(void) {
        char info[] = "5 seconds elapsed.";
        timer_t timerid;
        struct sigevent sev;
        struct itimerspec trigger;
        struct itimerspec triggerAfter;
    
        memset(&sev, 0, sizeof(struct sigevent));
        memset(&trigger, 0, sizeof(struct itimerspec));
    
        sev.sigev_notify = SIGEV_THREAD;
        sev.sigev_notify_function = &thread_handler;
        sev.sigev_value.sival_ptr = &info;
    
        if(0>timer_create(CLOCK_REALTIME, &sev, &timerid)) return perror("timer_create"),1;
    
        trigger.it_value.tv_sec = 5;
    
        if(0>timer_settime(timerid, 0, &trigger, NULL)) return perror("timer_settime"),1;
    
        pause();
    
    }
    

    如果您仍想忙于检查,则需要将timer_gettime 置于等待循环中。仅调用一次不会使trigger 对象自行自动更新。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多