Closed. This question needs to be more focused。它当前不接受答案。                                                                                                                                                                                                                                                                                                                        想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。                                                在8个月前关闭。                                                                                                                    如何在C ++或C语言的Linux中创建2个间隔计时器?我希望第一个间隔计时器调用一个每毫秒递增一个变量的函数,第二个计时器每10毫秒调用另一个函数。 最佳答案 该解决方案不需要任何单独的线程,第三方库或信号。唯一的警告-根据您的应用程序可能是障碍,也可能不是障碍-主while()循环的每次迭代都必须小于计时器的间隔。请记住注释中提到的警告-您不能真正期望与RTOS中的计时准确性相同-我认为最简单的方法是使用clock_gettime()-转换 value转换为毫秒值。首先为您的计时器信息定义一个结构:struct interval_timer { unsigned interval; // interval - in milliseconds void (*callback)(const void *); // callback void *callback_arg; // callback arguments unsigned last_triggered;};添加一些回调:static void timer_1_callback(const void *ignore) { printf("Timer 1 expired ...\n");}static void timer_2_callback(const void *ignore) { printf("Timer 2 expired ...\n");}创建您的计时器数组:static struct interval_timer timers[] = { {250, timer_1_callback}, {1500, timer_2_callback},};测试:int main(int argc, char *argv[]) { struct timespec elapsed = {}; clockid_t clock_id = CLOCK_MONOTONIC; size_t timer_count = sizeof(timers) / sizeof(timers[0]); printf("Timer tests. %zu timers total ...\n", timer_count); while (1) { clock_gettime(clock_id, &elapsed); long now_ms = timespec_to_ms(&elapsed); for (int i = 0; i < timer_count; i++) { struct interval_timer *timer = &timers[i]; if (now_ms - timer->last_triggered > timer->interval) { timer->last_triggered = now_ms; timer->callback(timer->callback_arg); } } usleep(50); } return 0;}将struct timespec转换为毫秒的助手:static long timespec_to_ms(struct timespec *ts) { long ms = ts->tv_sec * 1000; ms += ts->tv_nsec / 1000000; return ms;}备择方案带有struct timespec的信号您可以使用setitimer()-使用setitimer()作为时钟ID。每当计时器到期时,这都会生成一个ITIMER_REAL,并且通过安装适当的信号处理程序,您可以设置一个在主SIGALRM循环中读取的标志。但是,当您仅可以调用while()来检查clock_gettime()循环的每次迭代的时间时,为什么还要麻烦这个问题并引入与信号相关的问题呢?无论哪种情况:您都必须确保while()循环的频率高于计时器的频率。使用信号的另一个问题是,很难确定哪个计时器已到期。我不知道将信息传递给信号处理程序的任何直接方法。关于c++ - 如何在Linux C++中创建多个间隔计时器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56630733/
10-13 09:18