2011-11-27 85 views
0

我正在从一个外部USB设备读取MIDI数据的项目中工作。我不想在这里得到太具体的内容,但这大致是这样的:C++在对象“更改”后立即执行操作

我已经将所有传入的MIDI事件堆叠在一个对象中,我们称它为“in”。现在,为了从堆栈中获得下一个MIDI事件,我首先必须检查“in”是否使用成员函数在堆栈上至少有一个事件。

有没有办法自动处理堆栈中的所有事件,只要有新的堆栈,而不必每次检查? 我正在考虑类似事件监听器的事情(对不起,如果这听起来很愚蠢,我是一个初学者)。

+1

事件如何被放入堆栈?如果该类有一个被调用来推送堆栈上的事件的方法,那么该方法也可以通知侦听器新项目可用。 – Nerdtron

+0

看看[观察者模式](http://en.wikipedia.org/wiki/Observer_pattern) – knittl

回答

-3

观察者模式就是为了这个目的。

+0

至少链接到维基百科页面或其他东西。 –

+1

mmmm。这个答案如何不等于回头说“你想在事件发生时做点什么”。这个答案在OP的“正确但无用的”部门中 – sehe

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