2011-11-27 76 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