批处理就是一系列事件的组合执行:
class Batch {
private:
std::vector<Event> m_events;
public:
Batch();
void add(const Event&);
void run(Client&);
};
一个简单的调用实例,在浏览某个主题中的帖子时候,当浏览到帖子底部继续按下,就是
浏览下一个帖子,相当于KEY_LEFT+KEY_DOWN+KEY_RIGHT的组合操作(TODO:用户自定义脚本,类似CS里面的一键买枪)
void ViewPostServlet::processEvent(Event event)
{
int response = processWidgetEvent(event);
if (response == R_DONE) {
m_client->backward();
}
else if (response == R_BLUR) {
if (event.type == EV_KEY_DOWN || event.type == EV_KEY_PAGE_DOWN) {
Batch viewNextBatch;
viewNextBatch.add(Event(EV_KEY_LEFT));
viewNextBatch.add(Event(EV_KEY_DOWN));
viewNextBatch.add(Event(EV_KEY_RIGHT));
viewNextBatch.run(*m_client);
}
else if (event.type == EV_KEY_UP || event.type == EV_KEY_PAGE_UP) {
Batch viewPrevBatch;
viewPrevBatch.add(Event(EV_KEY_LEFT));
viewPrevBatch.add(Event(EV_KEY_UP));
viewPrevBatch.add(Event(EV_KEY_RIGHT));
viewPrevBatch.run(*m_client);
}
}
}
提高一下效率,Batch内部优化:
void Batch::run(Client& client)
{
client.doFlush = false;
unsigned int i;
for (i = 0; i < m_events.size() - 1; i++) {
client.processEvent(m_events[i]);
}
client.doFlush = true;
client.processEvent(m_events[i]);
}
只有最后一个事件执行的时候才产生输出.
--
修改:hzt FROM 202.120.189.*
FROM 202.120.189.*