Как я могу установить десятки тысяч задач для каждого триггера в разное определенное время? - PullRequest
0 голосов
/ 17 сентября 2010

Я создаю систему визуализации данных, которая визуализирует более 100 000 точек данных (посещений веб-сайта) за период времени.Период времени (скажем, 1 неделя) затем преобразуется в время моделирования (1 неделя = 2 минуты в моделировании), и задача выполняется для каждого фрагмента данных в конкретное время, когда это происходит во время моделирования (время каждого посещения).произошло в течение недели в режиме реального времени).Со мной?= p

В других языках программирования (например, Java) я бы просто установил таймер для каждой точки данных.После завершения каждого таймера он вызывает обратный вызов, который позволяет мне отображать эту точку данных в моем приложении.Я новичок в C ++ и, к сожалению, кажется, что таймеры с обратными вызовами не являются встроенными.Например, другой метод, который я бы сделал в ActionScript, - это использование пользовательских событий, которые запускаются после определенного периода времени.Но опять же, я не думаю, что C ++ также поддерживает пользовательские события.

В двух словах;скажем, у меня есть 1000 частей данных, которые охватывают период 60 секунд.Каждый фрагмент данных имеет свое время относительно этого 60-секундного периода.Например, нужно запустить что-то за 1 секунду, другое за 5 секунд и т. Д.

Правильно ли я поступаю, или есть более простой способ сделать это?

Ps.Я использую Mac OS X, а не Windows

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010

Я бы не использовал таймеры для этого. Похоже, у вас слишком много событий, и они могут лежать слишком близко друг к другу. Производительность и точность могут быть плохими с таймерами.

симуляция обычно выполняется так: Вы просто делаете циклы (или итерации). И в каждом цикле вы добавляете либо измеренное (для реального времени), либо постоянное (не в реальном времени) количество к вашему времени симуляции. Затем вы вручную проверяете все свои события и выполняете их, если они должны. В вашем случае было бы полезно отсортировать их по времени выполнения, чтобы вам не приходилось просматривать их все каждую итерацию.

Измерение Tme может быть выполнено с помощью функции gettimer () c для низкой точности или есть лучшие функции для более высокой точности, например, QueryPerformanceTimer () для Windows - не знаю эквивалента для Mac.

1 голос
/ 17 сентября 2010

Просто создайте механизм «таймера», это самый лучший, быстрый и гибкий способ.

-> создать массив событий (связанных с каждым случаем объекта) (std :: vector в c ++ / STL) -> отсортировать массив по времени (std :: sort в 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 ++ и указателях функций / методов.

0 голосов
/ 17 сентября 2010

Если вы используете собственный C ++, вам следует обратиться к разделу «Таймеры» Windows API на веб-сайте MSDN. Они должны сказать вам именно то, что вам нужно знать.

...