Подсчет времени с таймером в C - PullRequest
2 голосов
/ 13 апреля 2019

Я хочу запустить программу на 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);
        }
    }
}

1 Ответ

2 голосов
/ 13 апреля 2019

Если вы хотите проверить и сравнить в занятом цикле, вы можете просто позвонить 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 не будет автоматически обновляться самостоятельно.

...