Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有时钟或定时器的情况下在C中执行时间循环?_C_Loops - Fatal编程技术网

如何在没有时钟或定时器的情况下在C中执行时间循环?

如何在没有时钟或定时器的情况下在C中执行时间循环?,c,loops,C,Loops,我想在特定时间以秒为单位一个接一个地执行2个不同的输出。并使用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) [Ev

我想在特定时间以秒为单位一个接一个地执行2个不同的输出。并使用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)
我一直在寻找问题,比如和,我只找到那些有计时器和时钟的。我不打算使用计时器和时钟,因为我已经使用utilTimer库实时返回秒数。 以下是my 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程序。基本上,我想做的是,我想推动一个输出,在这种情况下,一个字符串输出和一个图像,所以在几秒钟后,字符串和图像会重复地改变。我希望能够使用键控制频率的变化。

如果我正确理解了这个问题,您可以在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
    }
}

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

如果对计时器使用无符号值,则不会出现滚动问题(这将导致有符号整数溢出,并导致未定义的行为)

我在上面使用
while(1)
是为了传达这样一个想法,即
while
循环中的代码经常执行。实际上,这不需要,也可能不会是
while
循环。可能是

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

你好,谢谢。我试着按照你的建议使用睡眠。不幸的是,这需要太长的时间,它的滞后和大部分时间导致我的程序没有响应。我注意到睡眠时间实际上比我定义的要长。此外,睡眠功能将暂时“睡眠”我的程序,当睡眠发生时,我的计数计时器也将停止。我需要这个实时的。因此,计数器需要实时正常计数,并在每个特定时间交换输出。还有其他建议吗?考虑使用函数GeTraseAGE()。它测量用户cpu时间和系统cpu时间您的问题没有任何意义,您真正想要的是什么,以及您为什么不使用
clock\u t
timer
(?),以及您的“utilTimer”是什么?请阅读。试着用你使用“Ulitimer”的例子来说明你试图完成的总体目标,这对我们帮助你的愿望非常有帮助。你在运行linux吗?在运行普通linux时,通过循环进行计时永远不会准确。您的进程将在不可预测的时间被调度程序挂起。您只需获得亚秒精度的时间,并使用该时间而不是计数。另外,最好在循环中有10毫秒的睡眠时间,以避免占用所有的CPU。另外,在你需要做某事的时间上也要有变量。然后,当该时间小于当前时间时,执行该操作并按间隔增加变量。不要那样使用mod,它不必要的复杂。@Leonard我明白,我已经尽力把我的问题弄清楚了。我已经更新了我的问题。谢谢你,也谢谢你的解释!不幸的是,我遇到了来自while(1)的无限循环问题,导致我的程序没有响应。但这是我需要的答案。再次感谢。我还有另一个问题,让我们假设5秒的时间循环。如果我长时间不按任何键怎么办?最后一个事件将保持不变,最后我的“现在”值将始终大于最后一个事件,因此输出永远不会更改。请看一下这个,因为每次延迟过期都会设置
最后一个事件
,所以每隔
延迟
秒就会有一个事件(只要
现在
继续增加)。在您的白板图片中,您需要在时间10设置上次事件。我理解。非常感谢。关于无限while循环,即使我在第二个条件(else)中使用sleep函数,在第一个条件(if)中使用scanf()作为阻塞机制,我仍然有无限循环,并且我的程序没有响应(只是黑屏)。有什么建议吗?请参阅我的更新答案,其中详细说明了
的目的,而(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
    }
}