纯理论的消息与事件探讨

以下文字,仅是个人学习心得,不对之处,欢迎批评指正:

了解事件和消息,首先要了解其基本概念,其次要了解操作系统特性、操作系统的事件与消息、和应用软件三者之间的因果关系。

一、 事件与消息

事件是什么,简单的来说,事件是特定条件下的客观动作状态。

消息是什么,简单的来说,消息是特定事件发生后产生的多种行为方式之一。

二、操作系统中事件、消息与应用程序的关系

1、在DOS时代,操作系统是一个只能处理单一事件(或者单一消息)的单任务系统、同时它在执行事件或消息时,是以顺序执行的一个操作系统。这样一来,我们在其上编制应用程序,只能根据其操作系统的特性,编写以单事件(或者单一消息)处理,以顺序执行的应用程序。

2、进入WINDOW时代,操作系统变成了一个以处理多事件(或者多消息)的多任务系统,同时它在执行事件或消息时,也是以顺序执行的一个操作系统。这样一来,我们在其上编制应用程序,也只能根据其操作系统的特性,编写以多事件(或者多消息)处理,以顺序执行的应用程序。当然了,由于存在一个包含性问题,单任务系统开发的程序稍加改造也可以运行于多任务系统。

三、应用程序面对的选择:

了解了以上知识后,我们先从理论上来探讨一下,对于一个应用程序的编写,我们有几种选择?

答案很明显,不管是单任务系统,还是多任务系统,我们只能以以下三种方式进行编程:

1、是以监控事件的发生进行编写,而不用去关心消息。

2、是以监控消息的发生进行编写,而不用去关心事件。

3、第三种比较奇特,它同时监控事件和消息的发生,从而进行编写,同时,我们也不得不两者同时关心。

四、两方面的优先考虑:

    以上三种,在理论上是完全可行的,但我们还必须关心另外两个比较重要的问题,一个是效率问题,另一个是实际应用的可能性。

(一)、我们先从效率上审视:三种编程方式上,哪一种效率更高呢?我们分析一下:

首先,为了保证每个事件或者消息得到全部处理,我们应当有一个队列,把所有的事件或消息放到队列中,使其得到处理,而不致于丢弃。

其次,我们应当设计全局性的循环结构,以确保对所有的事件和消息进行检索和分类、以及完成分发。

1、对于事件,我们设一个队列,把它们排序,并且编写一个事件循环,检取循环中的每一个事件,然后给每一个事件对应一个处理函数,然后进行处理就行了。

2、对于消息,我们同样设一个队列,把它们排序,也同样编写一个消息循环,检取循环中的每一个消息,同时也应给每一个消息一个对应的处理函数,然后进行处理就行了。

3、对于事件和消息同时关心的编写,我们得费点力气设立两套队列,编写两套循环同时捡取事件和消息,然后再编写两套处理函数,继而进行处理。

(二)从效率的角度考虑,一目了然,我们的选择似乎只有最上面两种。

我们再从实际应用的可能性上进行审视,三种编程方式上,哪一种应用更为宽泛呢?我们分析一下:

1、 对于事件,我们知道,事件的发生是不可预知的,谁也不敢保证,用户会在某一个时侯,会对应用程序进行一个什么样的操作动作。这样一来,我们把一个未知的事件放到队列中进行排序,似乎变的很困难。但也不是不可能,前提是:我们需要对这个事件进行必要的分解和编号、或者是分类这样的操作。如果我们不用队列进行干预呢?似乎也可以,但这样一来,我们就无法保证所有的事件得到处理,并且很多事件会发生撞车和互拆的情况,这样看来,真是一场灾难。这无形中给我们编写程序造成了额外的开销。

2、对于消息,我们可以明确一点的是,消息是事件发生后产生的,它有一个明确的结果,而且这个结果是唯一的,这就为我们在队列中排序提供了基础,同时为循环检索大开方便这门。这样看来,通过消息处理编程这个想法应当不错。

3、对于事件和消息同时进行处理的编程,我们已不用考虑了,过于复杂。虽然在理论上可行,或者随着人们在编程领域理解的不断加深,还有可能会产生其他意想不到的益处,但那也是未来的事情了,暂时对于我们还是难以完成。

五、个人学习的一点结论:

1、对于单任务操作系统,不管我们使用哪一种编程,似乎都一样。因为它是以一个事件或者一个消息的、按顺序处理,所以,无所谓那一种。

2、对于多任务操作系统,消息和事件都可以考虑,它们各有特点,但相对来说,按消息处理编程,效率更高,实际应用更宽泛,也更为简便。

六、破解传言

      至此,我们有了上述知识后,再来看一看网上关于事件驱动和消息驱动的一些传言:

1、WINDOWS是事件驱动的。

    这个传言并不完全正确,因为WINDOWS当然也可以用消息进行驱动。反之,也一样。

2、WINDOWS下的应用程序,是基于消息处理的。

    这个传言也并不完全正确。因为WINDOWS下的应用程序,既可以用消息方式处理,也可以用事件方式处理。

3、事件产生消息?

    也不完全正确,事件可以产生消息,但消息也可以再次产生消息。

4、事件只产生消息?

    错,实质上,事件不但会产生消息,还会产生其它玩意儿,消息只是事件产生后的其中一个副产品。

5、事件可以转换为消息?

    正确,它当然可以。

6、消息可以转换为事件?

    可以,但前提是对事件进行编号,并与某一消息挂钩。相当于某事件=某消息 。

7、将来会不会产生,多事件处理,随机顺序的操作系统?

    我不知道,真得不知道。出现这种操作系统的目的是什么,我不知道。我估计现在的AI系统有这样的需要吧!到那时,新的编程问题肯定要变革,这是肯定的。

8、我没见过你说的事件驱动方式的程序?

    libevent , 是 libev 的事件驱动库,它可以运行于WINDOWS上,虽然我对该库,从没有看过,也没有研究过,但在理论上它应该存在。实质上,基于事件处理的程序大量用于网络上。你可以看看它的原理。能不能用于图形界面库,我想应该可以吧!(待进一步探讨吧)

9我没有见过用运事件和消息同时进行编写的程序?

    我也没见过,但理论上,它依然可以存在。而且理论上它虽然繁杂,但它可能是最强大的。这么说吧,能编写出事件驱动和双驱动的都是大神,我只有仰慕的份。

10,我没有见过消息驱动的应用程序?

    很多,大部分程序以及图形库都是基于消息处理的应用程序。它最简单。健壮性也较强。

猜你喜欢

转载自blog.csdn.net/eedos/article/details/89225139