C ++库提供事件循环的功能来处理事件驱动的应用程序的瞬时事件和计划的事件
事件循环处理事件,可选地通知注册接收器
您可以使用事件循环阻止当前线程进行事件处理,或者作为独立线程,将当前线程免费用于其他任务
注意:此库为在同一过程中的多线程事件过程提供了一个框架,而没有任何IPC功能
EventLoop::Mode::BLOCK此事件循环模式将阻止已发出EventLoop::Run()调用的当前线程(通常是主线程)
然后,只要循环运行,当前线程将继续处理事件
EventLoop::Mode::NON_BLOCK此模式将在另一个线程上运行事件循环,该线程将防止当前线程EventLoop::Run()呼叫已被阻止。
当当前线程在同一线程上启动事件循环后,或者它已经使用其自己的阻止事件循环后,当前线程必须进行某些执行,这可能很有用。后者的一个示例可以是QT Framework的QGuiApplication::exec()呼叫,该呼叫会阻止主线程并开始处理事件
这提出了一个重要的问题:为什么像QT的exec()这样的主要循环需要次要事件循环?
我不知道您,但是我非常想念QT活动循环中的某些功能,例如向所有已注册/订阅的接收器广播信号的能力。这是从头开始开发事件循环库的主要动机,除了我对事物的工作方式和渴望狗食的瘙痒的好奇心之外,还有一些其他动机!
当您希望应用程序的多个组件对单个刺激作用时,无需将每个接收器与发件人的显式连接到单个刺激时,广播是典型的。祝您好运将发件人实例传递给多个接收器,并为每个接收器创建一个信号插槽连接,以在QT中启用广播接收!
另一个可靠的理由是为整个应用程序创建一个全局事件处理系统,而无需对事件提供商或关联的发送者和接收器对象进行任何参考,以注册和触发事件。 EventLoop是一个独立的静态类,具有静态方法,使开发人员能够从绝对的任何线程中发出API调用,与QT中的任何位置不同,在QT中,发件人和接收器对象需要创建连接和发射信号。
作为用户,您可以将事件循环库动态链接到您的应用程序,并将EventLoop.h标头包含在应用程序代码中以访问库方法。由于我们将Event用作自定义类型来交付和接收名称和数据的事件,因此Event.h将在源文件中需要从传入事件获取这些详细信息
注意:除了上面在您的应用程序中使用库时,请勿在该项目的包含目录中包含任何其他标题。要记住的另一种方法是,您只需要应用程序和所有
.hpp文件的.h标头文件
详细的API文档可以在EventLoop.h标题中找到。以下步骤显示了您的应用程序中事件循环的使用情况:
main()函数中,请致电EventLoop::SetMode()方法,如果您希望循环是非障碍物。无需明确调用以进行阻止模式,因为这是默认模式main()中调用EventLoop::Run()方法,您希望事件循环启动和/或块EventLoop::RegisterEvent()在任何类或源文件中接受Event*的注册回调,您希望在其中通知事件。通常,注册是在lambdas或类成员作为处理程序的类构造函数中进行的EventLoop::TriggerEvent()在应用程序的任何线程中触发事件,以及为特定事件名称注册的相应处理程序将立即或超时后调用,取决于使用的超载类型Event Type的Event::getName()和Event::getData()方法从已注册的处理程序中从接收到的事件中检索信息EventLoop::Halt()方法的明确调用优雅地退出。该方法可以从任一模式中的任何线程调用。如果在注册处理程序中调用,它将仅在完成处理程序范围内生效Tip: If you're planning to use
EventLoopon top of Qt'sexec()event loop, set up non-blockingEventLoop::Run()before theexec()call andEventLoop::Halt()to be invoked on theQGuiApplication::aboutToQuitsignal as follows for a graceful exit
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
注意:封锁
EventLoop::Run()在同一线程上呼叫之后,任何代码都不会执行,直到事件循环停止,因为EventLoop::Run()将当前线程阻止当前线程以设计为“处理事件”。
购物车应用程序是此库和API的使用参考。如果有任何疑问或澄清,您可以通过[email protected]与我联系。
在build.sh Releases中查看库的最新稳定版本
可以在没有任何选项的情况下运行脚本。每个选项的默认值将显示在使用指令中的{}中。通过运行以下命令来了解脚本用法
./build.sh -h
例如,如果要使用Unix Makefiles cmake Generator使用该脚本来构建释放模式,则可以执行脚本如下
./build.sh -a -r -g "Unix Makefiles"
构建工件将在build目录”中生成
输出工件将在lib目录中以libEventLoop.so
如果您认为,欢迎您为该项目做出贡献
作为潜在的贡献者,您可以
如果有任何疑问或建议,请随意与我联系。