我正在开发一个从外部USB设备读取MIDI数据的项目。我不想在这里过于具体,但这大概就是这样:
我将所有传入的MIDI事件堆叠在一个对象中,让我们称之为“in”。现在,为了从堆栈中获取下一个MIDI事件,我首先要检查“in”是否在堆栈中使用成员函数至少有一个事件。
有没有办法在新的时候自动处理堆栈上的所有事件,而不必每次都检查? 我正在考虑类似于事件监听器(抱歉,如果这听起来很愚蠢,我是初学者)。
答案 0 :(得分:2)
有没有办法在新的时候自动处理堆栈上的所有事件,而不必每次都检查?我正在考虑类似于事件监听器(抱歉,如果这听起来很愚蠢,我是初学者)。
当您使用堆栈时,代码可能如下所示:
// 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。
答案 1 :(得分:-3)
观察者模式就是为了这个目的。