【问题标题】:Run two delays at once C++一次运行两个延迟 C++
【发布时间】:2017-12-05 14:19:32
【问题描述】:

我想制作一个程序,其中有两个点同时闪烁(间隔 10 毫秒),但一个延迟 200 毫秒,另一个延迟 300 毫秒。我怎样才能从一开始就同时播放这两个点?以下是否有更好的方法:

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);
}

【问题讨论】:

  • TurboC++?你确定要使用那个古老的编译器吗?
  • 是的,我是初学者,只想使用它
  • 什么的初学者? TurboC++ 不是 C++。
  • @Jodocus 很可能无法避免这种情况。但如果他可以,他应该知道他正在学习旧的非标准东西。
  • @YashMittal 作为初学者,从一开始就养成良好的习惯至关重要,因为不学习比学习更难。从一个不支持良好习惯的工具开始,你会对自己造成很大的伤害。这就像一个木匠在学习如何拧螺丝,工具箱里只有锤子。

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


【解决方案1】:

我会这样做:

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;
  } 
 }

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

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

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

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

渲染标志只是确保场景仅在更改时渲染。

要改善计时,您可以使用 RDTSC 代替 t+=10,并以 CPU 频率准确度实际测量经过的时间。

【讨论】:

    【解决方案2】:

    要在第一轮同时显示两个圆圈,您必须同时满足i%2==0i%3==0 这两个条件。你可以通过简单的改变来实现它

    for(int i=1;i<100;i++)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多