На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Libevent - запуск основного цикла
      Здравствуйте,

      Подскажите пожалуйста, вот читаю книгу по Libevent: https://www.seul.org/~nickm/libevent-book/R..._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_ONCE я проверял вот таким кодом (под Windows VS2019):

      ExpandedWrap disabled
            #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);  
            }


      При этом если я меняю флаг EVLOOP_ONCE на EVLOOP_NO_EXIT_ON_EMPTY - то цикл крутится бесконечно, как и заявляется для флага EVLOOP_NO_EXIT_ON_EMPTY.
      А вот флаг EVLOOP_ONCE - не ждет событий, а сразу выходит. Получается, что EVLOOP_ONCE - работает не корректно, не так, как заявляется в документации ?
        В источникек написано
        Цитата
        Once you have an event_base with some events registered (see the next section about how to create and register events)

        Я почитал немного и раздела о регистрации не нашел. Или вы регистрируете неким образом все таки?
          Цитата Oleg2004 @
          Я почитал немного и раздела о регистрации не нашел. Или вы регистрируете неким образом все таки?


          Скорее всего не регистрирую, раздела о регистрации тоже не нашел.
          Но дело в том, что флаг EVLOOP_NO_EXIT_ON_EMPTY - работает заявленным образом - даже если нет не одного события, даже если я вообще не одного сокета не создал - EVLOOP_NO_EXIT_ON_EMPTY запускает бесконечный цикл в ожидании этих событий.
          А вот EVLOOP_ONCE - выходит сразу, что теоретически не должно быть и EVLOOP_ONCE должен ввести себя так же, как и EVLOOP_NO_EXIT_ON_EMPTY до появление хотя бы первого события.
            Посмотрите вот https://russianblogs.com/article/82912066937/здесь...по моем у заслуживает внимания
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0248 ]   [ 16 queries used ]   [ Generated: 16.04.24, 16:12 GMT ]