2016-03-07 3 views
2

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

http://stdcxx.apache.org/doc/stdlibug/11-3.html

Когда я играл вокруг с примером с некоторыми изменениями, я наступило условие, когда два события (прибытие, вылет) происходят одновременно (скажем, в момент 5), тогда симулятор просто всплывает, что находится в верхней части очереди событий, как видно из приведенного ниже фрагмента кода.

void simulation::run() { 

while (! eventQueue.empty()) { 

event * nextEvent = eventQueue.top(); 
eventQueue.pop(); 
time = nextEvent->time; 
nextEvent->processEvent(); 
delete nextEvent; 
    } 
} 

Если оба событие происходит в то же самое время, как я могу следить за соблюдением условий, которые всегда поп определенного события (прибытие события первого) до события вылета.

Любая помощь очень ценится.

+0

Если вы хотите воспроизводимые моделирования, «время» ** есть ** порядок событий. В то же время не бывает двух событий. –

+0

хорошо, я принимаю вашу точку. Но все же у меня есть вопрос, что произойдет, если два события имеют одно и то же время? Можем ли мы детерминистически сказать, какое событие произойдет первым?через остальную симуляцию. Спасибо – user2532296

+0

Если одновременно происходят два события, это ** ошибка **. Это не должно происходить в правильно функционирующей системе. Просто исправьте это. –

ответ

5

Я предполагаю, что eventQueue имеет тип, описанный here (потому что это ссылка на ссылку в вашем вопросе). Оттуда, вы можете прочитать, что top() ...

Возвращает постоянную ссылку на элемент в очереди с наивысшим приоритетом

... и что pop() ...

Удаляет элемент с наивысшим приоритетом из очереди.

Таким образом, принимая код из ваших вопросов, наиболее очевидный подход будет принимать все события из очереди, которые имеют то же самое время, и только затем обработать их:

while (! eventQueue.empty()) { 
    event * ev = eventQueue.top(); // WHY do you have pointers here ?!?!? 
    time = ev->time; 
    some_container<event *> arrivals, departures; 
    // Take out all events that happen "now" from the queue 
    while (time == ev->time) { 
    eventQueue->pop(); 
    if (ev->type == ARRIVAL) { 
     arrivals.push_back(ev); 
    } else { 
     departures.push_back(ev); 
    } 
    ev = eventQueue->top(); 
    } 
    // Process arrivals 
    for (event * e : arrivals) { 
    e->processEvent(); 
    delete e; // Again: WTF pointers? raw? NOT a good idea! 
    } 
    // Process departures 
    for (event * e : departures) { 
    e->processEvent(); 
    delete e; 
    } 
} 

НО. ..

... это не идиоматический способ справиться с этим в C++. Контейнеры (по крайней мере, упорядоченные) в C++ обычно имеют параметр шаблона, определяющий способ упорядочивания элементов. И так делает std::priority_queue:

namespace std { 
    template <class T, 
      class Container = vector<T>, 
      class Compare = less<Container::value_type> > 
    class priority_queue; 
} 

Таким образом, лучший подход здесь заключается в создании общего порядка среди всех событий, используя пользовательские функции сравнения объекта:

Обратите внимание, что для этого будет a всего закажите, вы должны быть уверены, что не будет нескольких прибытий (или вылетов) в одно и то же время. Если будут (возможно) такие обстоятельства, то вы должны (если хотите детерминированное моделирование) найти другие свойства (имя? Источник?) Событий, чтобы привести их в порядок.

Ваш eventQueue затем будет объявлен как

std::priority_queue<event *, std::vector<event *>, less_event_ptr<event>> eventQueue; 
+0

Привет, Даниэль, спасибо за ваш ответ. На данный момент мне приходится иметь дело с несколькими событиями прибытия/вылета, которые происходят одновременно. Я проверяю это и скоро вернусь к вам. – user2532296

+0

Привет, Даниэль, я мог понять решение, которое вы даете. Я попытался придумать минимальный, полный и проверенный пример, чтобы я мог попробовать ваш ответ и принять его. Вот простой фрагмент кода (https://gist.github.com/gmahet/2634e67e51a44d709df9), который повторяет проблему, о которой я упоминал. Можете ли вы помочь мне интегрировать ваш код, чтобы я мог проверить его и принять ваш ответ. благодаря – user2532296

 Смежные вопросы

  • Нет связанных вопросов^_^