Периодическое выполнение определенного кода в программе с задержкой - C (СИ)
Формулировка задачи:
Кто подскажет, возможно ли создать программу, которая с определённой частотой (скажем, раз в секунду) делает что-то простое (скажем, добавляет строку в файл), чтобы выполнялись следующие условия:
- Программа консольная, для Windows
- На чистом Си, не C++
- Чтобы задержкой не тормозила другие задачи
Решение задачи: «Периодическое выполнение определенного кода в программе с задержкой»
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;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы со временем, файловым вводом-выводом и потоками.
- Определение функции обратного вызова timerproc, которая будет вызываться по таймеру. Функция получает указатель на аргумент, представленный в виде строки, и выводит его на экран. Внутри цикла while функция ждет указанное время до следующего вызова.
- Создание переменной-флага i для отслеживания времени в функции main.
- Создание массива символов text для хранения строки
Time:с добавлением значения i. - Создание нового потока timerproc с передачей в него аргумента text.
- В бесконечном цикле в функции main с задержкой в 5 секунд происходит обновление значения i и, соответственно, строки text.
- Возврат 0 из функции main, что означает успешный запуск программы.