首页 > 解决方案 > 执行不同时期的功能

问题描述

我必须在代码中执行一些函数,这些函数有自己的周期值,例如,func1是 5 秒,funcN有 19 秒的周期。

为此,我有一个名为的变量taskTime,它每秒增加一次。periodOfFuncX我将函数周期存储在一个名为where entryi表示函数周期的数组中i(我使用 1 索引)。我取模funcTime和周期值来决定是否可以执行这些函数。伪代码如下:

N <- 10 // lets say there are 10 functions
func1() {/* ... */}
func2() {/* ... */}
/* ... */
func10() {/* ... */}

periodOfFuncX[N]
fillPeriods { /* assign period of each function to periodOfFuncX */}

periodLoop()
{
  funcTime <- 0
  fillPeriods()
  while true do:
    if(funcTime % periodOfFuncX[1] == 0) {func1()}
    if(funcTime % periodOfFuncX[2] == 0) {func2()}
    if(funcTime % periodOfFuncX[3] == 0) {func3()}
    /* ... */
    if(funcTime % periodOfFuncX[10] == 0) {func10()}
    delay(1) /* assume 1 second delay */
    funcTime <- funcTime + 1 /* increment the timer. Note that timer is going to overflow and reset when exceeds INT_MAX */
}

这种方法有缺点。它可以在第一个条目中执行所有函数,但是当funcTimer溢出和分配时0,它会通过突然异步执行所有函数来违反函数的周期。此外,顺序执行在循环内和循环之间引入了聚合延迟。另一方面,我只有一个很好的计时器变量。如果我添加&& funcTime != 0到 if-checks,则不会在上述溢出和获取 0 的情况下调用函数。

您对我描述的问题有其他建议或评论吗?

PS我不太确定要分配哪些标签。如果您帮助标记,会很高兴。

标签: algorithmtime

解决方案


对于较小的 N 和周期,请尝试通过周期的最小公倍数对 funcTime 取模。否则,我强烈建议使用以各自周期为模的计时器列表。它可能会以更优雅的编码结束。


推荐阅读