End*_*age 7 c++ java events event-handling
我刚刚使用SDL编写了一些简单的程序,这让我回想起我编写的一些Java GUI.
在简单的SDL程序中,我有一个循环来检查任何事件(按键,鼠标点击等......)并对它们做出反应.基本上它是对输入的轮询.
在Java中,您将侦听器附加到GUI对象,并在发生特定事件时触发侦听器.
我的问题是,Java是否只是在后台为我们处理这个轮询循环,并解决了点击哪个GUI控件以便它可以触发正确的监听器,或者是否有更复杂的事情发生?
我知道Qt有一个与Java类似的事件系统,你可以使用插槽将处理程序连接到GUI控件.这也只是处理所有轮询并确定为我们点击了哪个控件?或者,是否有更复杂的事情发生?
UPDATE
也许我对这个问题不够清楚.我真的想知道一个事件如何桥接OS层 - 应用层边界.应用程序是否轮询操作系统层并将事件信息提取到应用程序中?或者操作系统是否有某种方法可以中断/通知应用程序发生了事件,并将事件信息推送到应用程序.
第三个解决方案已经向我建议应用程序调用阻塞本机函数,如:
Event e = someNativeFunction(); // blocks until someNativeFunction() returns an event
Run Code Online (Sandbox Code Playgroud)
"...... Java是否只为后台处理这个轮询循环......?"
差不多,是的.UI系统为程序提供对包含已发生事件和目标的队列的访问.该程序通过循环请求来自此队列的项目,然后执行任何操作.像Qt和Java这样的库调用窗口小部件类中的特殊函数,告诉它们事件已经发生,以便系统可以从那里运行,但是由API规定.库必须从系统特定的窗口ID转换为管理该窗口小部件的类才能执行此操作.
Qt以受保护的虚拟onXxxxEvent()功能的形式提供对此功能的访问.许多小部件的标准行为是响应于事件生成信号,但这些始终是特定小部件特定事件的一些翻译形式.Qt为您提供访问权限,以便您可以覆盖窗口小部件处理事件的方式,或者为之前从未侦听过的事件添加其他行为(通过子类化).
每个UI系统略有不同,但根据我的经验,它们在这方面基本相同.我们在这里谈论原始的win32和Xlib.