Здравствуйте,
Подскажите пожалуйста, вот читаю книгу по 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);
}