我正在從一個外部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