Библиотека C ++ Предоставление функциональности цикла событий для обработки мгновенных и запланированных событий для приложений, управляемых событиями
Цикл событий обрабатывает события, чтобы уведомить зарегистрированные приемники опционально с помощью данных
Вы можете использовать цикл событий, чтобы заблокировать текущий поток для обработки событий или в качестве независимого потока, оставляя текущий поток бесплатно для других задач
Примечание. Эта библиотека предоставляет структуру для многопоточных процессов событий в том же процессе без каких-либо возможностей МПК
EventLoop::Mode::BLOCK Этот режим цикла событий заблокирует текущий поток (обычно основной поток), где был выдан вызов EventLoop::Run()
Текущий поток будет затем продолжать обрабатывать события, пока цикл работает
EventLoop::Mode::NON_BLOCK Этот режим будет запускать цикл события в другом потоке, который предотвратит текущий поток, где был выдан вызов EventLoop::Run()
Это может оказаться полезным, когда текущий поток должен либо добраться до какого -то выполнения после запуска цикла событий в том же потоке, либо, если он уже использует свой собственный цикл блокировки. Примером последнего может быть вызов QGuiApplication::exec() , который блокирует основной поток и начинает обработку событий
Это поднимает важный вопрос: зачем нужен петля вторичного события, когда уже существует первичный QT exec() ?
Я не знаю о вас, но я сильно пропустил некоторые функции в цикле событий QT, например, возможность транслировать сигнал всем приемникам, которые зарегистрировались/подписаны на него. Это была основная мотивация для разработки библиотеки цикла событий с нуля, помимо других, таких как мое ненасытное любопытство к тому, как все работает и зуд для собак!
Вещание является типичным, если вы хотите, чтобы несколько компонентов приложения действовали на один стимул без необходимости подключения каждого приемника с явностью отправителя. Удачи, передавая экземпляры отправителя нескольким приемникам и создание подключения сигнального слота для каждого, чтобы включить вещательный прием в QT!
Еще одна веская причина состояла в том, чтобы создать глобальную систему обработки событий для всего приложения без каких -либо ссылок на поставщика событий или связанных объектов отправителя и приемника, чтобы зарегистрировать и запустить событие. EventLoop - это автономный статический класс со статическими методами, позволяющими разработчику выпустить вызов API из абсолютно любого потока, в любом месте в коде, в отличие от QT, где ручки отправителя и объектов приемника необходимы для создания соединений и излучения сигналов.
Как пользователь, вы можете динамически связать библиотеку цикла событий с вашим приложением и включить заголовок EventLoop.h в код приложения для доступа к методам библиотеки. Поскольку мы используем Event в качестве пользовательского типа для доставки и получения событий с именем и данными, заголовок Event.h потребуется в исходных файлах, получая эти данные из входящего события
Примечание. Не включайте какие -либо другие заголовки из каталога включения этого проекта, кроме тех, которые упомянуты выше при использовании библиотеки в вашем приложении. Другой способ запомнить, что вам нужны только файлы заголовка
.hдля вашего приложения, и все файлы.hppможно игнорировать
Подробную документацию API можно найти в заголовке EventLoop.h . Следующие шаги демонстрируют возможное использование цикла событий в вашем приложении:
main() вашей программы вызовите метод EventLoop::SetMode() Если вы хотите, чтобы цикл не блокировал. Не нужно явно звонить в режим блокировки, потому что это режим по умолчаниюEventLoop::Run() в main() , где вы хотите, чтобы цикл событий запустился и/или блокировалEvent* в любом классе или исходном файле с помощью EventLoop::RegisterEvent() , где вы хотите получить уведомление о событии. Обычно регистрации выполняются в конструкторах класса с Lambdas или функциями члена класса в качестве обработчиковEventLoop::TriggerEvent() и соответствующие обработчики, которые зарегистрировались для конкретного имени события, будут вызваны либо мгновенно, либо после тайм -аута в зависимости от типа используемой перегрузкиEvent Event::getName() и Event::getData() МетодыEventLoop::Halt() . Этот метод может быть вызван из любого потока в любом режиме. При вызове внутри зарегистрированного обработчика он вступит в силу только при завершении масштаба обработчикаСОВЕТ: Если вы планируете использовать
EventLoopна вершине цикла событий QTexec(), настройте не блокирующуюEventLoop::Run()перед вызовомexec()иEventLoop::Halt()который будет вызван наQGuiApplication::aboutToQuit
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
ПРИМЕЧАНИЕ. Любой код сразу после блокировки
EventLoop::Run()вызов в том же потоке не будет выполняться до тех пор, пока цикл событий не будет остановлен, потому чтоEventLoop::Run()блокирует текущий поток для обработки событий по проектированию.
Приложение для корзины для покупок служит использованием этой библиотеки и API. В случае любых вопросов или разъяснений, вы можете обратиться ко мне по адресу [email protected]
Проверьте последние стабильные выпуски библиотеки под Releases , но если вы хотите построить библиотеку из источника с текущей версией исходного кода, запустите скрипт build.sh
Сценарий может быть запущен без каких -либо вариантов. По умолчанию для каждой опции появятся в {} в инструкции по использованию. Узнайте об использовании сценария, выполнив следующую команду
./build.sh -h
В качестве примера, если вы хотите использовать скрипт для сборки режима выпуска с генератором Cmake Unix Makefiles , сценарий можно выполнить следующим образом
./build.sh -a -r -g "Unix Makefiles"
Артефакты сборки будут генерироваться в каталоге build
Выходной артефакт будет присутствовать в lib Directory как libEventLoop.so , который может быть дополнительно связан или перенесен к вашему целевому назначению
Вы можете внести свой вклад в проект, если подумаете
Как потенциальный участник вы можете
Не стесняйтесь, свяжитесь со мной в случае любых вопросов или предложений [email protected]