一次运行两个延迟C ++

时间:2017-12-05 14:19:32

标签: c++ delay turbo-c++

我想制作一个程序,其中有两个点同时闪烁(中断10ms),但一个延迟200ms,另一个延迟300ms。如何从头开始同时播放这两个点?以下是否有更好的方法:

for(int i=1;i<100;i++)
{
  if (i%2==0)
    circle(10,10,2);
  if (i%3==0)
    circle(20,10,2);
  delay(10);
  cleardevice();
  delay(100);
}

2 个答案:

答案 0 :(得分:0)

我会做这样的事情:

int t0=0,t1=0,t=0,s0=0,s1=0,render=1;
for (;;)
 {
 if (some stop condition like keyboard hit ...) break;
 // update time, state 
 if (t>=t0) { render=1; s0=!s0; if (s0) t0+=10; else t0+=200; }
 if (t>=t1) { render=1; s1=!s1; if (s1) t1+=10; else t1+=300; }
 // render
 if (render)
  {
  render=0;
  cleardevice();
  if (s0) circle(10,10,2);
  if (s1) circle(20,10,2);
  }
 // update main time
 delay(10); // Sleep(10) would be better but I am not sure it is present in TC++
 t+=10;
 if (t>10000) // make sure overflow is not an issue
  {
  t -=10000;
  t0-=10000;
  t1-=10000;
  } 
 }

请注意代码未经测试,因为我直接在这里编写代码(因此可能存在语法错误或拼写错误)。

基本思路是让一个全局时间t具有足够小的粒度(10ms)。并且对于每个对象都有事件的时间(t0,t1)对象状态(s0,s1)和句点(10/200 , 10/300)。

如果主时间到达事件时间,则打开/关闭状态并将事件时间更新为下一个状态交换时间。

通过这种方式,您可以拥有任意数量的对象,只需确保主时间步长足够小。

渲染标志只是确保场景仅在变化时渲染。

为了改善时间安排,您可以使用 RDTSC 代替t+=10,并实际测量 CPU 频率准确度已经过了多长时间。

答案 1 :(得分:0)

要在第一轮中同时显示两个圆圈,您必须同时满足条件i%2==0i%3==0。您只需更改

即可实现
for(int i=1;i<100;i++)

for(int i=0;i<100;i++)
//        ↑ zero here