C ++类 - 每N毫秒递增和递减属性

时间:2009-05-16 19:24:13

标签: c++ visual-studio timer

这一定是一个简单的问题,但我找不到合适的答案。

我在VS-C ++上编码。我有一个属性为'height'的自定义类'Person'。我想调用类方法Grow()来启动一个计时器,该计时器每0.5秒递增一次'height'属性。

我将有一个停止计时器的StopGrow()和递减而不是递增的Shrink()。

我真的需要稍微推动使用哪个计时器以及如何在Grow()方法中使用它。知道后,其他方法必须直截了当。

这是我在这里的第一个问题所以请善待(并警告我,如果我做错了:)请原谅我的英语,而不是我的第一语言。

5 个答案:

答案 0 :(得分:4)

你真的需要每半秒调用一次代码重新计算一个值吗?对于大多数情况,还有另一种更简单,更快速,更有效的方法。

不要暴露高度成员,但要使用GetHeight()之类的方法,它会在您需要的时刻计算高度。

您的Grow()方法会设置基本高度值和开始时间,而不是其他任何内容。然后,当您需要时,您的GetHeight()方法将从当前时间中减去开始时间以“立即”计算高度。

不需要计时器!

答案 1 :(得分:1)

由于您使用的是Windows,因此最简单的解决方案可能是使用Windows提供的GetTickCount()函数。

C ++语言中没有一个好的计时器功能,精度保证不到一秒钟。

相反,请包含windows.h标头,然后调用GetTickCount()以获得毫秒数。下次调用它时,你可以减去这两个值,如果结果超过500,则经过半秒钟。

或者,如果要阻塞线程半秒,请使用Sleep(n)函数,其中n是您希望线程休眠的毫秒数。 (在你的情况下为500)

答案 2 :(得分:1)

您可能需要查看CreateTimerQueue()CreateTimerQueueTimer()。我从来没有亲自使用它们,但它们可能符合要求。

我目前产生了一个负责基于计时器的操作的线程。它在手动重置事件上调用WaitForSingleObject()并超时10ms。它以指针方法和调用回调的对象的形式保留内部回调集合。这一切都隐藏在提供调度程序接口的单例后面,该接口允许调用者调度方法在定时器到期后或定期在间隔上调用对象。看起来我提到的两个函数应该给你几乎相同的功能...嗯...可能是时候重新审视调度程序代码......; - )

答案 3 :(得分:0)

睡眠()正常定时器事件以10ms时钟运行 对于Windows上的高分辨率计时器事件,请使用high resolution timers

答案 4 :(得分:0)

根本不是一个简单的问题!你至少有两种可能性:

  • 创建一个执行循环的线程:睡眠0.5秒,增加身高,睡眠0.5秒,增加身高等。
  • 反转控制流并将其传递给某个框架,如Boost :: Asio,它将每隔0.5秒调用一次计时器处理程序。

为了做出正确的决定,您必须考虑整个申请。它是否计算某些东西(然后可能是线程)?它是否与用户交互(然后可能是事件驱动的)?每种方法都有一些问题:

  • 当你使用线程时,你必须处理锁定,这可能很棘手。
  • 当你做事件驱动的东西时,你必须编写异步处理程序,这可能很棘手。