如何在不同的定义时间为每个触发器设置数万个任务?

时间:2010-09-17 09:57:10

标签: c++ events timer data-visualization

我正在构建一个数据可视化系统,可以在一段时间内显示超过100,000个数据点(访问网站)。然后将时间段(例如1周)转换为模拟时间(模拟中1周= 2分钟),并且在模拟时间(每次访问的时间)发生的特定时间对每个数据执行任务。本周发生在实时)。与我一起? = P

在其他编程语言(例如Java)中,我只需为每个数据点设置一个计时器。每个计时器完成后,它会触发一个回调,允许我在我的应用程序中显示该数据点。我是C ++的新手,不幸的是,似乎带有回调的计时器不是内置的。例如,我在ActionScript中要做的另一种方法是使用在特定时间范围之后触发的自定义事件。但是我再也不认为C ++也支持自定义事件。

简而言之;说我有1000个数据跨越60秒的时间段。每个数据都有自己相对于60秒的时间。例如,一个人需要在1秒触发一些东西,另一个需要在5秒触发等等。

我是以正确的方式解决这个问题,还是有更简单的方法来做到这一点?

聚苯乙烯。我使用的是Mac OS X,而不是Windows

3 个答案:

答案 0 :(得分:4)

我不会使用计时器来做到这一点。听起来你有太多的事件,他们可能会彼此太靠近。定时器的性能和准确性可能不好。

模拟通常是这样完成的: 你正在做循环(或迭代)。在每个循环中,您可以为模拟时间添加测量(实时)或常量(非实时)量。 然后手动检查所有事件并在必要时执行它们。 在您的情况下,将它们排序为执行时间将有助于您不必在每次迭代时循环遍历它们。

可以使用gettimer()c函数进行测量,以获得较低的精度,或者可以使用更好的函数来获得更高的精度,例如: Windows上的QueryPerformanceTimer() - 不知道Mac的等价物。

答案 1 :(得分:1)

自己做一个“计时器”机制,这是最好,最快,最灵活的方式。

- >创建一个事件数组(链接到每个对象事件)(std :: vector in c ++ / STL) - >按时排序数组(std :: sort in c ++ / STL) - >然后只需循环数组并在一个范围内按时触发对象动作/方法。

粗略地说,这是用C ++提供的:

// action upon data + data itself
class Object{
public:
  Object(Data d) : data(d) {

  void Action(){display(data)};

  Data data;
};

// event time + object upon event acts
class Event{
public:
   Event(double t, Object o) time (t), object(o) {};

   // useful for std::sort
   bool operator<(Event e) { return time < e.time; }


  double   time;
  Object   object;


}
//init
std::vector<Event> myEvents;

myEvents.push_back(Event(1.0, Object(data0)));
//...
myEvents.push_back(Event(54.0, Object(data10000)));

// could be removed is push_back() is guaranteed to be in the correct order
std::sort(myEvents.begin(), myEvents.end());

// the way you handle time... period is for some fuzziness/animation ?
const double period = 0.5;
const double endTime = 60;
std::vector<Event>::iterator itLastFirstEvent = myEvents.begin();
for (double currtime = 0.0; currtime < endTime; currtime+=0.1)
{
  for (std::vector<Event>::iterator itEvent = itLastFirstEvent ; itEvent != myEvents.end();++itEvent)
  {
    if (currtime - period < itEvent.time)
      itLastFirstEvent = itEvent; // so that next loop start is optimised
    else if (itEvent.time < currtime + period) 
      itEvent->actiontick(); // action speaks louder than words
    else 
      break; // as it's sorted, won't be any more tick this loop
  }
 }

ps:关于自定义事件,您可能希望在c ++和函数/方法指针中读取/搜索委托。

答案 2 :(得分:0)

如果您使用的是本机C ++,则应该查看MSDN网站上Windows API的“计时器”部分。他们应该准确地告诉你你需要知道什么。