如何在没有clock_t或timer的情况下在C中执行时间循环?

时间:2018-10-14 00:03:40

标签: c loops

我想在几秒钟内的某个特定时间执行两个不同的输出,一个接一个。并使用keyEvent更改交换时间。这是主意。

[Every 10 seconds]
1 2 3 4 5 6 7 8 9 (10) 11 12 13 14 15 16 17 18 19 (20)  (→ second-from timer lib.)
Display Output 1 = 1-10 second
Display Output 2 = 11-20 second, (then Output 1 again, etc)

[Every 5 seconds]
1 2 3 4 (5) 6 7 8 9 (10) 11 12 13 14 (15) 16 17 18 19 (20)(→ second-from timer lib.)
Display Output 1 = 1-5 second
Display Output 2 = 6-10 second
Display Output 1 = 11-15 second, (then Output 2 again, etc)

我一直在寻找问题,例如Timed C Program LoopHow to use seconds (time) in C program as a counter?,但我只发现了带有timer和clock_t的问题。我不打算使用计时器和时钟,因为我已经使用了utilTimer库来实时返回秒数。 这是我的keyEvent代码:

if (key == '1' ) {
    delay=10;
}
if (key == '2' ) {
    delay=5;
}
if (key == '3' ) {
    delay=3;
}
if (key == '4' ) {
    delay=1;
}

如何实现时间循环?到目前为止,对于循环,我正在使用mod,但是使用mod时,输出值仅在满足mod时才执行一次。另外,由于我正在实时运行,因此很难设置循环的最大值。因此,我仍然有些困惑,还没有实现我的目标。

for (int count = 0; true; count++) {
    if (count % delay == 0) {
        //push output 1 every defined delay - in seconds
    }
    else {
        //push another output
    }
}

有什么建议吗?

[编辑]

我在Mac上运行一个简单的C程序。基本上,我想做的是在这种情况下要推送输出字符串输出和图像,因此几秒钟后字符串和图像将反复更改。而且我希望能够使用键控制变化的频率。

2 个答案:

答案 0 :(得分:1)

您需要跟踪上次更改图像和字符串的时间。然后,从当前时间中减去最后一个时间,如果差异大于延迟,则输出新的图像和字符串,然后将最后一个时间变量更新为当前时间。

如果为计时器使用无符号值,则翻转不会有麻烦(对于有符号整数会溢出,并导致未定义的行为)。

unsigned now;        // from your timer
unsigned last_event; // the last time you sent stuff out
unsigned delay;      // the time between output events

while (1)
{
    if ((now - last_event) >= delay)
    {
        // send out your string and image
        last_event = now;
    }
    else
    {
        // keep waiting, and do whatever else you want
        // update now as appropriate from timer
    }
}

我在上面使用while (1)的目的是传达这样一个想法,即while循环内的代码经常执行。实际上,这不是必须的,也可能不是while循环。可能是

  • 嵌入式应用程序中的一个“超级循环”
  • 在RTOS任务中
  • 在大型OS线程内
  • 在游戏程序的“框架”调用中
  • 等等。

答案 1 :(得分:0)

如果我理解正确的问题,则可以在for循环中使用sleep。它在unistd.h库中。

#include unistd.h
for (int count = 0; true; count++) {
    sleep(1000); //sleep for 1 second
    if (count % 10 == 0) {
    //every 10 seconds
    }
    if (count % 5 == 0) {
    //every 5 seconds
    }
}