c - 如何在 C 中实现时钟例程

标签 c time

我正在尝试用 C 语言创建一个例程,每隔 X 毫秒执行一些代码。

我已经用 C# 完成了,但我需要用 C 编写这个程序。

我曾尝试使用 time(0) 或 clock() 来实现它,但这些函数的问题是我可以让系统在执行某些代码后等待一定时间。

我的意图是让代码在时间 block X 中执行。 假设 X 是 25ms 执行一些代码。 之后,如果我还有时间,在 X = 25 之前什么都不用做

否则,如果我已经用了 30 毫秒来执行我的操作,我将不得不等到下一个时钟滴答来做其他事情。

预先感谢您的任何建议。

最佳答案

我在这个答案中使用的函数是 POSIX 函数。在 Windows 等非 POSIX 系统上,这些功能可能不可用。

解决此类问题的一般方法是让系统每 25 毫秒或您必须等待的任何持续时间向您发送一个信号。一种方法是设置一个计时器(例如使用 setitimer)并为相应的信号(即 SIGALRMSIGVTALRM)设置信号处理程序) 计时结束后重新启动计时器。然后,您可以进行计算并使用 pause 系统调用“等待”下一个信号来打断您。

如果您的时间段比这短得多,则信号传输对于您的用例来说可能太慢了。您可以调用 clock 函数来获取您在循环中使用的时间量,并等待它足够接近 25ms 的倍数。这种方法比基于信号的方法延迟更短,但它会使您的处理器忙碌,因此只有在您必须等待的时间非常短时才使用它。这种方法的优点是非常便携,因为 clock 是标准 C 的一部分。

第三种方法是获取当前时间,然后计算您需要等待的时间,直到下一次滴答发生,然后调用 nanosleep 或类似的函数来等待该时间。这种方法是不精确的(你可能睡的时间比你想睡的时间多一点),但它不会造成任何漂移,因为每次你找到当前时间时你都会与时钟同步。

关于c - 如何在 C 中实现时钟例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743807/

相关文章:

c - 添加时链接不指向下一个元素

c - 需要帮助解决仅在 Linux 中发生的段错误

c++ - 如何将elasticsearch的数据保存为json格式?

c - gtk_grid_set_row_spacing 与 gtk_table_set_row_spacings

python - timeit 偶尔会返回一个负值,可能是 timeit 的 bug

ruby - 寻找一种可以在 ruby 中显示明天日期的方法

c# - Python 到 C# 移植后的错误计算

c++ - 在 C++17 中获取以毫秒为单位的时间?

c - 当它的所有 'for' 都是 "parts"时, 'i++' 如何工作?

sql-server - PostgreSQL 找到两个时间戳之间的中点