c ++ делает что-то, как только объект «меняется» - PullRequest
0 голосов
/ 27 ноября 2011

Я работаю над проектом, который читает MIDI-данные с внешнего USB-устройства. Я не хочу вдаваться в подробности, но это примерно так:

У меня все входящие MIDI-события сложены внутри объекта, давайте назовем его "in". Теперь, чтобы получить следующее MIDI-событие из стека, я сначала должен проверить, есть ли у «in» хотя бы одно событие в стеке, используя функцию-член.

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

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

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

Когда вы используете стек, код может выглядеть так:

// producer
stack.push(midi_event);

// consumer
while(!stack.empty())
    process_event(stack.pop());

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

// set-up the producer-consumer callback
Consumer consumer;
Producer producer(&consumer); // saves Consumer* into a member-variable
// start the event processing loop
while(producer_or_an_event_loop_object.wait_and_dispatch())
    ; // loop till wait_and_dispatch() returns false


// Producer::produce_event()
this->consumer->process_event(midi_event); 

Библиотека Boost.signalsразработан для такого рода проблем и имеет хороший учебник по теме.

0 голосов
/ 27 ноября 2011

Для этого предназначен шаблон наблюдателя.

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