Libevent - запуск основного цикла
От: Optimus1  
Дата: 21.12.21 13:22
Оценка:
Здравствуйте,

Подскажите пожалуйста, вот читаю книгу по Libevent: https://www.seul.org/~nickm/libevent-book/Ref3_eventloop.html

Там написано, что функция event_base_loop() — запускает цикл обработки событий и у event_base_loop есть три флага:

-EVLOOP_ONCE: Если установлено EVLOOP_ONCE, то цикл будет ждать, пока некоторые события не станут активными, затем запустить активные события до тех пор, пока не останется больше для запуска, а затем вернется.
-EVLOOP_NONBLOCK : Если EVLOOP_NONBLOCK установлен, то цикл не будет ждать запуска событий: он будет только проверять, готовы ли какие-либо события к немедленному запуску, и запускать их обратные вызовы, если это так.
-EVLOOP_NO_EXIT_ON_EMPTY: Если вы установите EVLOOP_NO_EXIT_ON_EMPTY, цикл будет продолжаться до тех пор, пока кто-нибудь не вызовет event_base_loopbreak () или не вызовет event_base_loopexit (), или пока не возникнет ошибка.


Я не могу понять, я правильно понимаю, что EVLOOP_ONCE — говорит event_base_loop — ждать пока не появится хотя бы одно событие, и если появилось или было в момент запуска(одно или более) то обработать их, если события в очереди закончились, то завершить свою работу ?? Если я понимаю правильно, то это почему то не работает.

И позвольте пожалуйста еще один вопрос: а, чем собственно EVLOOP_NONBLOCK отличается от EVLOOP_ONCE ? Тем, что, если во время запуска, если событий в очереди нет — то цикл ждать их ен будет и сразу завершит работу ?


Работу EVLOOP_ONCE я проверял вот таким кодом (под Windows VS2019):



    #include <iostream>
    #include <string>
    #include <vector>
    #include <thread>
    #include <chrono>
    
    #include <event2/bufferevent.h>
    #include <event2/buffer.h>
    #include <event2/event.h>
    
    

    //Подключаем Windows DDL-lib:
    #pragma comment(lib, "Normaliz.lib")
    #pragma comment(lib, "Ws2_32.lib")
    #pragma comment(lib, "Wldap32.lib")
    #pragma comment(lib, "Crypt32.lib")
    #pragma comment(lib, "advapi32.lib")
    #pragma comment(lib, "Iphlpapi.lib")
    
    
    
    int main()
    {
    
        WORD my_version_Winsock = MAKEWORD(2, 2); 
        WSADATA my_wsadata_struct; 
    
        int my_WSAStartup = WSAStartup(my_version_Winsock, &my_wsadata_struct);  
    


        struct event_base* Event_base = event_base_new();         
    

    
        event_base_loop(Event_base, EVLOOP_ONCE ); //запускаем цикл, который теоретически, если я правильно понял - должен дождаться хотя бы одного события
    

        //Однако event_base_loop - ни ждет ни каких событий и сразу завершается.
    
    

        event_base_free(Event_base);  
    }
Re: Libevent - запуск основного цикла
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 21.12.21 13:29
Оценка:
Здравствуйте, Optimus1, Вы писали:

O>Я не могу понять, я правильно понимаю, что EVLOOP_ONCE — говорит event_base_loop — ждать пока не появится хотя бы одно событие, и если появилось или было в момент запуска(одно или более) то обработать их, если события в очереди закончились, то завершить свою работу ??


Да, это типовая логика.

O> event_base_loop(Event_base, EVLOOP_ONCE ); //запускаем цикл, который теоретически, если я правильно понял — должен дождаться хотя бы одного события


А вы хоть что-то ему дали? Насколько я вижу — ни сокета, ни таймера.
В этом случае он вполне может считать, что раз пустой набор ожидания — лучше сразу выйти — это тоже типовой вариант в подобных библиотеках.

Сделайте, например, UDP сокет и подкиньте ему ожидание на чтение.

O>И позвольте пожалуйста еще один вопрос: а, чем собственно EVLOOP_NONBLOCK отличается от EVLOOP_ONCE ? Тем, что, если во время запуска, если событий в очереди нет — то цикл ждать их ен будет и сразу завершит работу ?


Да.

Но вообще libevent — это наиболее неудачный, как по мне, пример такой библиотеки — самый корявый и негодный API среди всех.
За красивой и удобной реализацией идите или к libuv хотя бы, libev, или к ISC eventlib...
Для C++ можно сразу смотреть на boost.asio (если проактивность не мешает).
The God is real, unless declared integer.
Отредактировано 21.12.2021 13:32 netch80 . Предыдущая версия .
Re[2]: Libevent - запуск основного цикла
От: Optimus1  
Дата: 21.12.21 13:32
Оценка:
N>А вы хоть что-то ему дали? Насколько я вижу — ни сокета, ни таймера.
N>В этом случае он вполне может считать, что раз пустой набор ожидания — лучше сразу выйти — это тоже типовой вариант в подобных библиотеках.

А, понял, попробую. Я думал, что даже без сокета цикл все равно должен ждать, думал, какая ему разница создан сокет или нет.


N>Но вообще libevent — это наиболее неудачный, как по мне, пример такой библиотеки — самый корявый и негодный API среди всех.

N>За красивой и удобной реализацией идите или к libuv хотя бы, или к ISC eventlib...

libuv — вроде пишут Windows — не поддерживает. И пишут, что к примеру libevent использует хромиум и node.js
Re[3]: Libevent - запуск основного цикла
От: night beast СССР  
Дата: 21.12.21 13:38
Оценка:
Здравствуйте, Optimus1, Вы писали:

O>libuv — вроде пишут Windows — не поддерживает.


не верно

O>И пишут, что к примеру libevent использует хромиум


не знаю

O>и node.js


использует libuv
Re[3]: Libevent - запуск основного цикла
От: Optimus1  
Дата: 21.12.21 13:46
Оценка:
N>>А вы хоть что-то ему дали? Насколько я вижу — ни сокета, ни таймера.
N>>В этом случае он вполне может считать, что раз пустой набор ожидания — лучше сразу выйти — это тоже типовой вариант в подобных библиотеках.

Все таки нет, если указать флаг EVLOOP_NO_EXIT_ON_EMPTY — то цикл ожидает бесконечно и цикл не завершается, даже, если я не создал ни одного сокета.
Все таки EVLOOP_ONCE — работает не корректно, не так, как заявляется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.