Порядок вызова wl_display_dispatch и wl_display_roundtrip - PullRequest
0 голосов
/ 28 февраля 2020

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

Было бы здорово, если бы кто-то мог прояснить это здесь. Заранее спасибо

1 Ответ

0 голосов
/ 13 марта 2020

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

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

...