曹娥做系统是如何感知事件的???

原创 2015年07月10日 08:28:06

我们知道,java中提供了事件机制,即:每一个动作,都产生一个事件。

那么,操作系统是如何感知事件的呢???

针对于一些问题:


问题:

1.“一般我们在开发窗体程序时,只需对按钮等绑定相应的操作事件监听,之后按钮就可以相应鼠标操作
但我想知道的是,操作系统底层又是如何知道按钮被鼠标点击了呢?

难道是操作系统对窗口中的任何元素都在毫秒级的监控着,比如监控按钮A,当发现按钮A上方有鼠标指针
这时就相当于监控到onmouseover,而当鼠标点击时,系统知道操作的对象是鼠标下方的按钮A,而不是其它按钮

不知正确否,请指点!谢谢 


2.如何看待java中的这一机制:即:  :::   动作-------》触发事件---->监听器:注册和处理事件???

现在理解这句话:点击该按钮是,JButton 对象触发一个ActionEvent,然后将它作为参数传递以调用监听器的actionPerformed()方法来处理这个事件。

其实,这是java自己的抽象。


要是深入的理解:

要点:只有从操作系统和汇编的角度,才能看透一些底层问题:

                    只有从操作系统的角度才能理解:

                 从汇编的角度: 那即是:     发出中断--------中断处理程序



()中断->鼠标驱动->raw input thread->应用程序的线程

()++这个是中断芯片控制的 打个比方你键盘 按下一个键 中断芯片就会发送一个中断信号给CPU 然后在发送一个中断量给CPU 然后CPU根据操作系统底层根据中断量跳转到预先设置的对应的中断任务( 至于怎么跳转这个涉及到段寄存器方面的知识 请自己去查了 三言两语说不清楚 ) 然后中断任务会去调用键盘或者鼠标驱动 ,然后形成一个事件 压入操作系统的事件队列 然后操作系统在分派给相应的应用程序线程


()CSRSS进程的线程RawInputThread 中 调用CreateFile() 

CreateFile 是个系统调用 

通过 sysenter 或者int 2e 进入内核模式  kiFastSystemCall 或(通过IDT) KisystemService 在ssdt索引

找到并调用NtCreateFile …  打开鼠标类驱动的设备\Device\PointerClass0

RawInputThread 执行ReadFile()  同样是个系统调用 …  进入内核模式的NtReadFile 

产生一个IRP_MJ_READ  然后WaitForSingleObject等在这里

IRP进入鼠标端口驱动i8042prt.sys 被挂入未完成队列

按下鼠标 ->设备中断  

进入IDT    中断号x4 获得获得中断门描述符地址

根据中断门里的段选择子 -> 在GDT中索引 ->得到段描述符->得到段地址 + 中断门里的 偏移

进入 KiInterruptTemplate  -> INT_PROLOG   … -> jmp KiInterruptDispatch@0

->call ServiceRoutine (由鼠标小端口驱动提供的中断服务例程)  调用鼠标类驱动提供的函数上交数据
  
鼠标类驱动完成IRP

NtReadFile继续执行 返回用户模式

RawInputThread得到鼠标位信息


按钮是个窗口

窗口的数据结构是 typedef struct _window_object {…}

里面有个MessageQueue  指向所属线程的报文队列结构 USER_MESSAGE_QUEUE  里面有七种用途的七个报文队列

报文队列结构 每线程一个  一个线程可以有多个视窗     一个线程中所有的窗口的窗口结构都 指向同一个报文队列

………………

按下按钮会触发postmessage 或 sendmessage(强制调用目标窗口的处理函数) 

postmessage把报文挂入 目标窗口的线程的报文队列  目标窗口通过getmessage得到  …………





C#捕获windows关机事件,在系统关机前做一些自己想做的事

C#捕获windows关机事件,在系统关机前做一些自己想做的事;有些时候我们可能想在Windows关机时记录或处理一些事情,这里提供几种方法。方法一: /// /// ...

离散时间信号与离散事件系统

  • 2016年11月18日 22:15
  • 595KB
  • 下载

QT事件系统

  • 2016年05月26日 09:59
  • 1.39MB
  • 下载

Linux下文件系统事件监听-inotify

从文件管理器到安全工具,文件系统监控对于的许多程序来说都是必不可少的。从 Linux 2.6.13 内核开始,Linux 就推出了 inotify,允许监控程序打开一个独立文件描述符,并针对事件集监控...

win7系统事件清理工具

  • 2012年05月18日 19:32
  • 99KB
  • 下载

android系统模拟点击事件发送QQ消息

  • 2014年05月26日 12:39
  • 1.89MB
  • 下载

嵌入式系统学习——STM32之UCOS-III事件标志组和存储管理

事件标志组:        有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。      “或”同步:等待多个事件时,任何一个...

动态更改屏幕方向与系统设置更改事件

http://book.51cto.com/art/201007/212204.htm动态更改屏幕方向 LANDSCAPE与PORTRAIT范例说明 要如何通过程序控制Activity的显示方向?在...
  • eustoma
  • eustoma
  • 2011年05月25日 23:52
  • 7493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:曹娥做系统是如何感知事件的???
举报原因:
原因补充:

(最多只允许输入30个字)