Порядок вызова wl_display_dispatch и wl_display_roundtrip

Я пытаюсь понять, какой из них следует вызывать раньше, а какой позже между 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 выглядит для меня правильным и логичным, так как нет шансов, что в очереди останутся ожидающие события. но я видел Order 1st во многих местах, в том числе в коде примеров клиентов Weston, поэтому я сбит с толку, каков правильный порядок вызова.

Было бы здорово, если бы кто-нибудь разъяснил здесь. заранее спасибо


person SanTosh    schedule 28.02.2020    source источник


Ответы (1)


2-й порядок правильный. клиент мало что может сделать, не получив прокси (дескриптор глобального объекта). я имею в виду, что клиент может отправить запрос путем привязки к глобальному объекту, объявленному сервером, поэтому этот клиент должен блокироваться до тех пор, пока все глобальные объекты не будут связаны в обратном вызове прослушивателя реестра.

например, для клиента, чтобы создать поверхность, вам нужно привязать интерфейс wl_compositor, затем к интерфейсу оболочки, чтобы дать роль, а затем shm (для общей памяти) и т. д. wl_display_dispatch не может гарантировать, что все события будут обработаны, если вам повезет, он также может отправлять все события, но не может гарантировать каждый раз. поэтому вы должны использовать wl_display_roundtrip как минимум для реестра.

person Tyson    schedule 13.03.2020