return BitTube::sendObjects(dataChannel, events, count); } ,MQ::cb_eventReceiver init初始化过程中MQ会监听 BitTube,从而调用到cb_eventReceiver方法 大致流程: 发送消息(REFRESH消息),接着就是图形渲染的过程了。 发送消息代码: int MessageQueue::cb_eventReceiver(int fd, int events, void* data) { MessageQueue* queue = reinterpret_cast<MessageQueue *>(data); return queue->eventReceiver(fd, events); } int MessageQueue ::eventReceiver(int /*fd*/, int /*events*/) { ssize_t n; DisplayEventReceiver::Event buffer[8
EventReceiver 就是用来接收Event,并且处理的。 而且需要留意,EventReceiver 是继承 ConsumerMixin。 class EventReceiver(ConsumerMixin): """Capture events. object at 0x000001CA8C22AB08>> self = {EventReceiver} <celery.events.receiver.EventReceiver object _receive = {method} <bound method EventReceiver.
/// class EventReceiver { //(3)编写事件处理程序 private void OnkeyDown(Object } //(4)利用编写的事件处理程序生成一个委托实例 //(5)把这个委托实例添加到产生事件对象的事件列表中去 public EventReceiver static void Main() { KeyInputMonitor monitor = new KeyInputMonitor(); EventReceiver receiver = new EventReceiver(monitor); monitor.Run(); } } } 运行结果: ?
建立连接,在通过createEventConnection的返回值获取BitTube对象,获取BitTube的fd利用Looper的addFd来监听数据,一旦数据到来则调用MedssageQuene的cb_eventReceiver createEventConnection(); //获取BitTube对象 mEventTube = mEvents->getDataChannel(); //监听BitTube,一旦有数据到来则调用MQ的 cb_eventReceiver () mLooper->addFd(mEventTube->getFd(), 0, Looper::EVENT_INPUT, MessageQueue::cb_eventReceiver
会调用 MessageQueue 内部的函数 eventReceiver(...) 。 eventReceiver 内部将会对进程中的消息获取,如果有收到其它进程传过来的对应的VSync 消息,那么将会对其进行下一步的分发,就是 dispatchInvalidate(...)
createEventConnection),接着SF会创建Connection对象,再通过Connection对象获取BitTube对象(本质是Socket),Looper监听BitTube的fd,接受到事件后回调MQ的eventReceiver