我试图弄清楚在wl_display_dispatch和wl_display_roundtrip之间应该先调用哪一个,然后再调用哪一个。我看过这两种顺序,所以想知道哪一种是正确的。
1st order:
wl_display_get_registry(display); wl_registry_add_listener() // this call is just informational
wl_display_dispatch();
wl_display_roundtrip();我认为: wl_display_dispatch()将从显示fd中读取和分派事件,无论服务器发送什么,但在两个服务器之间可能仍在处理请求,并且fd可能在短时间内为空。假设所有事件都已调度,则返回wl_display_dispatch。然后调用wl_display_roundtrip()并将其阻塞,直到服务器处理完所有请求并将其放入事件队列。因此,在此之后,事件队列仍然有挂起的事件,但不会调用wl_display_dispatch()。如何调度这些挂起的事件?wl_display_dispatch()是否在等待服务器处理所有事件,然后分派所有事件?
2nd order:
wl_display_get_registry(display); wl_registry_add_listener() // this call is just informational
wl_display_roundtrip();
wl_display_dispatch();在本例中,wl_display_roundtrip()等待服务器处理所有事件,并将它们放入事件队列中,因此一旦此返回,我们就可以假定从服务器发送的所有事件都在队列中可用。然后调用wl_display_dispatch(),它将分派所有挂起的事件。
对我来说,顺序2看起来是正确的和合乎逻辑的,因为队列中没有剩余的未决事件。但是我已经在5月份的地方看到了订单1,包括在weston客户端示例代码中,所以我搞不懂调用的正确顺序是什么。
如果有人能在这里澄清那就太好了。提前感谢
发布于 2020-03-13 15:03:10
第二个顺序是正确的。如果没有代理(全局对象的句柄),客户端就不能做很多事情。我的意思是,客户端可以通过绑定到服务器通告的全局对象来发送请求,因此对于这个客户端,必须阻塞,直到所有全局对象都绑定到注册表侦听器回调中为止。
例如,对于客户端创建界面,你需要绑定wl_compositor接口,然后绑定外壳接口来赋予角色,然后再绑定shm(共享内存),所以on.wl_display_dispatch不能保证所有的事件都被处理,如果你幸运的话,它也可以分发所有的事件,但不能保证每一次都被处理。所以你至少应该使用wl_display_roundtrip进行注册。
https://stackoverflow.com/questions/60447121
复制相似问题