曹娥做系统是如何感知事件的???
来源:互联网 发布:淘宝网店创业计划书 编辑:程序博客网 时间:2024/05/01 00:28
我们知道,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得到 …………
- 曹娥做系统是如何感知事件的???
- 事件是如何工作的?
- Spotify 高度可靠的事件交付系统是如何设计与运维的
- Activity是如何接收到touch事件的(窗口与用户输入系统)
- 类人的普适的计算机视觉是如何感知这个世界的?
- 输入框事件监听(五):如何感知JS设值的变化
- ACE_Reactor是如何做到事件分发的
- ACE_Reactor是如何做到事件分发的
- Eventbus是如何实现事件分发的
- ACE_Reactor是如何做到事件分发的
- 感知SessioSession 绑定的事件监听器
- 如何防范网络攻击?你需要这样的安全态势感知系统
- Kafka Producer是如何动态感知Topic分区数变化
- 基于攻击链的威胁感知系统
- 基于计算机视觉的无人驾驶感知系统
- 基于计算机视觉的无人驾驶感知系统
- 基于计算机视觉的无人驾驶感知系统
- 如何增强NetBeans的智能感知功能
- qxt: 并不支持qt5,其他excel解析的情况
- 笔试 - 洗牌算法
- Java通过JNI调用C++程序
- kafka 学习笔记(二)之Java Producer客户端
- Google 镜像站搜集
- 曹娥做系统是如何感知事件的???
- ZOJ 3761 Easy billiards (DFS性质)
- 黑马程序员-java基础IO流(2)
- 黑马程序员 面向对象 单例设计模式
- 黑马程序员 面向对象 继承 抽象
- 黑马程序员 面向对象 接口
- C++指针学习
- inheritance & class variable DEMO
- 黑马程序员 面向对象 多态 需求 object