QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2281|回复: 19

请问,在面向对象编程中,事件处理机制的原理是什么?

[复制链接]
发表于 2003-7-14 22:01:53 | 显示全部楼层 |阅读模式
比如事件的产生、传递、处理,和事件的管理等,有什么这方面的资料吗?
发表于 2003-7-14 22:26:02 | 显示全部楼层
从回调函数的指针进化而来的。
回复

使用道具 举报

发表于 2003-7-15 14:17:43 | 显示全部楼层
偶不懂,说清楚点楼上
回复

使用道具 举报

发表于 2003-7-15 14:19:08 | 显示全部楼层
应该调用虚函数吧!
回复

使用道具 举报

发表于 2003-7-15 14:22:19 | 显示全部楼层
这些概念和oop没什么关系 是操作系统的概念 linux下有buttom_half结构和后中断处理这些东西是和事件 信号 这些的实现有关的
回复

使用道具 举报

 楼主| 发表于 2003-7-15 20:57:35 | 显示全部楼层
我是这样考虑的:
所有的事件都来自程序的外部,那些由硬件和时间流逝所产生的事件,我把它们称为原始事件(比如鼠标移动、到了某一时刻等),这些原始事件可以组成另一些更高层的事件(比如鼠标双击、在按下ctrl后的300ms内又按下了空格)。通过定义这些更高层事件产生的条件,我们可以用这些条件对照在一定时间范围内发生的一系列原始事件以判断是否发生了某些更高层事件。先把这些更高层事件简称为组合事件。发生了事件后(原始事件或组合事件),事件调度器会检测这些事件,找到对应的处理函数,调用他们并通过函数的参数传给处理函数它所需要的数据,由此事件引发了行为。
[code:1]
          条件
              ↓
原始事件 → 事件组合器→ 组合事件
                       ↓
         处理函数 → 事件调度器
                       │
                       ↓
                      行为

[/code:1]
但是,我还有一些问题没有搞懂:
1.如何描述产生组合事件的条件;
2.如何管理事件处理函数,包括注册、调用、销毁等。
3.是否会牵涉到多线程问题。
回复

使用道具 举报

发表于 2003-7-15 23:10:47 | 显示全部楼层
1、使用消息队列
2、调用系统提供的API,系统根据自己的策略进行维护管理;
3、不知道。。。
回复

使用道具 举报

 楼主| 发表于 2003-7-16 11:50:13 | 显示全部楼层
1.“消息队列”是什么?有具体的描述吗?
一些简单的组合事件还是很好描述的,比如“按住鼠标左键的同时拖动鼠标”,那就是检测当前发生的所有事件里,“鼠标左键被按下”和“鼠标发生了移动”是否同时存在;但有些就不好办了,比如“顺序按下键盘上的asd然后再同时按下f和g”,典型的应用是在格斗游戏里,这个事件里涉及到各个原始事件发生的事件先后的问题。
2. 现在是我的程序维护管理事件和事件处理函数……
回复

使用道具 举报

发表于 2003-7-16 12:00:39 | 显示全部楼层
消息队列是Windows底层使用的数据结构,就是数据结构教科书上所说的先进先出的"队列",Linux下不太清楚。Qt中使用的信号-反应槽与之类似。

如果自己维护管理事件,就要自己建立这个队列,判断事件是哪个/些对象的,然后调用这些对象的响应函数。
回复

使用道具 举报

 楼主| 发表于 2003-7-16 15:46:25 | 显示全部楼层
我在看miniGUI的文档
现在才知道,其实这是窗口系统的技术问题~
回复

使用道具 举报

发表于 2003-7-16 16:18:04 | 显示全部楼层
信号 ,信号量(互斥量),MAILBOX(共享内存) , 消息(队列),管道
这是几乎每个多任务系统都提供的进程间通信机制
回复

使用道具 举报

发表于 2003-7-16 19:10:46 | 显示全部楼层
优先队列就是最大值堆

键盘是否可以产生同时按f和g件?我处理windows消息的时候,好像没有同时产生的时候。
回复

使用道具 举报

 楼主| 发表于 2003-7-16 20:09:29 | 显示全部楼层
我想两个事件不可能同时发生,总会有先后的,但如果间隔在一定的时间范围之内,就可以认为是同时发生的(从用户角度看),所以“同时按了f和g”,其实是“按了f”和"按了g"这两个事件在“时间间隔小于300ms”这个条件下的组合事件。所以我才要设计一个“事件组合器”。然后我就因为不知道怎么描述原始事件和组合事件而产生了困惑~
回复

使用道具 举报

发表于 2003-7-16 22:10:50 | 显示全部楼层
如果在间隔时间范围之内先产生了f,再产生了g
那应该理解成一个事件: f和g同时,还是两个事件: f和g?
回复

使用道具 举报

 楼主| 发表于 2003-7-16 22:47:25 | 显示全部楼层
[quote:a9109e6642="ShiChao"]如果在间隔时间范围之内先产生了f,再产生了g
那应该理解成一个事件: f和g同时,还是两个事件: f和g?[/quote]
我想,如果接受到这两个原始事件的程序,把f和g定义为一个组合事件的话,那就是同时按了f和g;如果这个程序没有这么“认为”的话,那就是两个事件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 11:18 , Processed in 0.046240 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表