Периодическое выполнение определенного кода в программе с задержкой - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Кто подскажет, возможно ли создать программу, которая с определённой частотой (скажем, раз в секунду) делает что-то простое (скажем, добавляет строку в файл), чтобы выполнялись следующие условия:
  • Программа консольная, для Windows
  • На чистом Си, не C++
  • Чтобы задержкой не тормозила другие задачи
Я пробовал через SetTimer(), но не работает (нужная функция не вызывается), а в некоторых местах пишут, что в консольных программах SetTimer() использовать нельзя.

Решение задачи: «Периодическое выполнение определенного кода в программе с задержкой»

textual
Листинг программы
#include <time.h>
#include <stdio.h>
#include <threads.h>
 
int __cdecl timerproc(void *arg) {
    struct timespec duration = {.tv_sec = 1, .tv_nsec = 0};
 
    while(1) {
        printf("%s\n", (char*)arg);
        if(thrd_sleep(&duration, NULL) != thrd_success)
            printf("\tInterrupted!\n");
    }
 
    return 0;
}
 
int main(void) {
    volatile int i = 0;
    char text[20];
    thrd_t proc;
    struct timespec duration = {.tv_sec = 0, .tv_nsec = 5000000000L};
 
    sprintf(text, "Time: %d", i++);
    thrd_create(&proc, timerproc, text);
    while(1) {
        thrd_sleep(&duration, NULL);
        sprintf(text, "Time: %d", i++);
    }
 
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы со временем, файловым вводом-выводом и потоками.
  2. Определение функции обратного вызова timerproc, которая будет вызываться по таймеру. Функция получает указатель на аргумент, представленный в виде строки, и выводит его на экран. Внутри цикла while функция ждет указанное время до следующего вызова.
  3. Создание переменной-флага i для отслеживания времени в функции main.
  4. Создание массива символов text для хранения строки Time: с добавлением значения i.
  5. Создание нового потока timerproc с передачей в него аргумента text.
  6. В бесконечном цикле в функции main с задержкой в 5 секунд происходит обновление значения i и, соответственно, строки text.
  7. Возврат 0 из функции main, что означает успешный запуск программы.

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы