Как я могу запустить код один раз в секунду, на втором? - PullRequest
2 голосов
/ 10 января 2011

Я писал утилиту командной строки для Mac, которая должна печатать информацию о состоянии каждую секунду, каждую секунду.Очевидно, я не хочу опрашивать миллион раз в секунду.Единственный другой способ, которым я могу придумать, - это получить текущее время и использовать select для ожидания разницы.Есть ли лучший способ?

Ответы [ 3 ]

4 голосов
/ 10 января 2011

Любое ожидание, которое вы делаете, гарантированно будет ждать, по крайней мере, такое количество времени, а не точно. OSX не ОС реального времени - я не думаю, что есть какой-либо способ гарантировать что-либо подобное.

Если вы просто хотите, чтобы он был оценен, сработает разница между текущим временем и временем, которое вы хотите (возможно, немного меньше, чтобы дать время для журнала).

1 голос
/ 10 января 2011

Вот что у меня есть:

#import <stdlib.h>
#import <stdio.h>
#import <time.h>
#import <sys/time.h>

#define TIME_LENGTH 9

int main ()
{
    struct timeval now;
    struct timespec wait;

    time_t seconds;
    char str[TIME_LENGTH];

    wait.tv_sec = 0;

    for (;;) {
        gettimeofday(&now, NULL);
        wait.tv_nsec = (1000000 - now.tv_usec) * 1000;
        nanosleep(&wait, NULL);

        seconds = now.tv_sec+1;
        strftime(str, TIME_LENGTH, "%T", localtime(&seconds));
        puts(str);
    }
}

Работает с точностью "глазного яблока", которая должна быть достаточно хорошей. Похоже, что он обновляется синхронно со встроенными часами меню. Очевидно, в time.h, clock_nanosleep есть функция, которая может ждать до некоторого времени, а не ждать определенного периода времени, но это использование не поддерживается на Mac.

1 голос
/ 10 января 2011

Обычно планирование метода с помощью таймера делает свое дело.Однако важно помнить, что точность не самая лучшая с простыми таймерами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...