我正在从一个外部USB设备读取MIDI数据的项目中工作。我不想在这里得到太具体的内容,但这大致是这样的:C++在对象“更改”后立即执行操作
我已经将所有传入的MIDI事件堆叠在一个对象中,我们称它为“in”。现在,为了从堆栈中获得下一个MIDI事件,我首先必须检查“in”是否使用成员函数在堆栈上至少有一个事件。
有没有办法自动处理堆栈中的所有事件,只要有新的堆栈,而不必每次检查? 我正在考虑类似事件监听器的事情(对不起,如果这听起来很愚蠢,我是一个初学者)。
我正在从一个外部USB设备读取MIDI数据的项目中工作。我不想在这里得到太具体的内容,但这大致是这样的:C++在对象“更改”后立即执行操作
我已经将所有传入的MIDI事件堆叠在一个对象中,我们称它为“in”。现在,为了从堆栈中获得下一个MIDI事件,我首先必须检查“in”是否使用成员函数在堆栈上至少有一个事件。
有没有办法自动处理堆栈中的所有事件,只要有新的堆栈,而不必每次检查? 我正在考虑类似事件监听器的事情(对不起,如果这听起来很愚蠢,我是一个初学者)。
是否有办法自动处理堆栈中的所有事件,只要有新的事件,而不必每次检查?我正在考虑类似于事件监听器的事情(对不起,如果这听起来很蠢,我是一个初学者)。
当您使用堆栈中的代码可能看起来像:
// 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库是专门为这类问题,关于这个问题有a nice tutorial。
事件如何被放入堆栈?如果该类有一个被调用来推送堆栈上的事件的方法,那么该方法也可以通知侦听器新项目可用。 – Nerdtron
看看[观察者模式](http://en.wikipedia.org/wiki/Observer_pattern) – knittl