我试图弄清楚在wl_display_dispatch和wl_display_roundtrip之间应该先调用哪个,然后在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阶对我来说是正确且合乎逻辑的,因为队列中没有剩余未决事件的机会。但我已经在包括weston客户示例代码在内的可能位置看到了1st顺序,所以我对正确的调用顺序感到困惑。
如果有人可以在这里澄清,那就太好了。在此先感谢
第二阶是正确的。客户不能不获得代理(全局对象的句柄)而做很多事情。我的意思是客户端可以通过绑定到服务器发布的全局对象来发送请求,因此该客户端必须阻塞,直到所有全局对象都在注册表侦听器回调中绑定为止。
例如,为客户端创建表面,您需要将wl_compositor接口绑定,然后绑定到shell接口以赋予角色,然后进行shm(用于共享内存)等等。也是,但不能保证每次。因此,至少应将wl_display_roundtrip用于注册表。