1

我试图弄清楚在 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() 将调度所有未决事件。

Order 2nd 在我看来是正确且合乎逻辑的,因为队列中没有剩余的未决事件。但是我已经在包括韦斯顿客户端示例代码在内的可能的地方看到了 Order 1st,所以我很困惑正确的调用顺序是什么。

如果有人能在这里澄清一下,那就太好了。提前致谢

4

1 回答 1

0

第二个顺序是正确的。如果没有代理(全局对象的句柄),客户端将无法做很多事情。我的意思是客户端可以通过绑定到服务器通告的全局对象来发送请求,因此对于该客户端必须阻塞,直到所有全局对象都绑定在注册表侦听器回调中。

例如,对于客户端创建表面,您需要绑定 wl_compositor 接口,然后绑定到 shell 接口以赋予角色,然后 shm(用于共享内存)等等。wl_display_dispatch 不能保证所有事件都得到处理,如果幸运的话它也可以调度所有事件,但是不能保证每次。因此,您至少应该将 wl_display_roundtrip 用于注册表。

于 2020-03-13T07:03:09.787 回答