导读 人之间有语言的交流还有一系列的信号传达信息,那么机器之间也有他们的语言,然而系统之间的工作也是靠互相通信才能完美的工作,那么就让我们看看其中的一种机制——消息机制。
从一个剧情开始

路遥的《平凡的世界》因为翻拍成电视剧,又再次火起来了!我们就从这里开始吧,其小说是以这样一个场景开头的:
在一个半山腰县立高中的大院坝里,在一个校园内的南墙根下,按班级排起了十几个纵队的年轻男女,各班的值日生正忙碌地给众人分发饭菜…… 菜分为甲、乙、丙三等,甲菜以土豆、白菜、粉条为主,还有可人大肉片,乙菜没有肉,丙菜只有清水煮白萝卜。主食也分为三等:白面馍,玉米面馍,高粱面馍,白、黄、黑分别代表了三种差别,学生们戏称欧洲、亚洲、非洲。每个人的饭菜都是昨天登记好并付了饭票的,在这一长长的队伍中自然以光景较好的富家子弟排在最前,光景一般的随后,而那些家庭贫困少吃缺穿的学生只能在其他学生走后才姗姗来迟……

这一活生生的例子虽然看着有些悲凉(排队打饭的情景相信曾经是学生的你一定经历过,可能没这般悲凉而已),却像极了消息机制的原理,也许发明消息机制的灵感就是原来于这样的生活吧!排队的学生就是消息队列,值日生分发饭菜就消息循环并完成消息处理,学生吃饭就类似于事件处理。

什么是消息?

何为消息?消息就是带有某种信息的信号,如你用鼠标点击一个窗口会产生鼠标的消息,键盘输入字符会产生键盘的消息,一个窗口大小的改变也会产生消息。
消息从何而来?根据冯·诺依曼的体系结构计算机有运算器、存储器、控制器和输入设备和输出设备五大部件组成,消息主要来自输入设备,如键盘、鼠标、扫描仪等,也可来自已窗口和操作系统。
消息机制的三大要点:消息队列、消息循环(分发)、消息处理。其结构如下:

图 1 :消息机制原理

消息队列就是存放消息的一种队列,具有先进先出的特点。每产生一个消息都会添加进消息队列中,在Window中消息队列是在操作系统中定义的。消息队列就如同一群排队打饭的少男少女,这群人中光景较好的排在前面,光景较差的排在后面,可以理解成是一种优先级队列!要想更多的了解队列的相关知识,可参见队列。
消息循环就是通过循环(如while)不断地从消息队列中取得队首的消息,并将消息分发出去。类似于上面的例子中分发饭菜值日生。
消息处理就是在接收到消息之后根据不同的消息类型做出不同的处理。上面例子中值日生根据学生不同类型的饭票给他们不同等级的饭菜就是消息处理,学生手中的饭票就是消息所携带的信息。
事件是根据接收到的消息的具体信息做出的特定的处理,放在代码中是事件响应函数。上面的例子中学生拿到饭菜后吃饭就是具体的事件。

消息机制模拟

在这里我们以控制台输入信息模拟窗口、对话框接收鼠标、键盘等消息,以ArrayBlockingQueue对象存放消息队列。在控制台中输入一个数值和一个字符串代表一个消息,输入-1结束输入。模拟代码如下:

package message;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
/**
* 消息
* @author luoweifu
*/
class Message {
//消息类型
public static final int KEY_MSG = 1;
public static final int MOUSE_MSG = 2;
public static final int SYS_MSG = 3;
private Object source; //来源
private int type; //类型
private String info; //信息
public Message(Object source, int type, String info) {
super();
this.source = source;
this.type = type;
this.info = info;
}
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = source;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public static int getKeyMsg() {
return KEY_MSG;
}
public static int getMouseMsg() {
return MOUSE_MSG;
}
public static int getSysMsg() {
return SYS_MSG;
}
}
interface MessageProcess {
public void doMessage(Message msg);
}
/**
* 窗口模拟类
*/
class WindowSimulator implements MessageProcess{
private ArrayBlockingQueue msgQueue;
public WindowSimulator(ArrayBlockingQueue msgQueue) {
this.msgQueue = msgQueue;
}
public void GenerateMsg() {
while(true) {
Scanner scanner = new Scanner(System.in);
int msgType = scanner.nextInt();
if(msgType < 0) { //输入负数结束循环
break;
}
String msgInfo = scanner.next();
Message msg = new Message(this, msgType, msgInfo);
try {
msgQueue.put(msg); //新消息加入到队尾
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
/**
* 消息处理
*/
public void doMessage(Message msg) {
switch(msg.getType()) {
case Message.KEY_MSG:
onKeyDown(msg);
break;
case Message.MOUSE_MSG:
onMouseDown(msg);
break;
default:
onSysEvent(msg);
}
}
//键盘事件
public static void onKeyDown(Message msg) {
System.out.println("键盘事件:");
System.out.println("type:" + msg.getType());
System.out.println("info:" + msg.getInfo());
}
//鼠标事件
public static void onMouseDown(Message msg) {
System.out.println("鼠标事件:");
System.out.println("type:" + msg.getType());
System.out.println("info:" + msg.getInfo());
}
//操作系统产生的消息
public static void onSysEvent(Message msg) {
System.out.println("系统事件:");
System.out.println("type:" + msg.getType());
System.out.println("info:" + msg.getInfo());
}
}
/**
* 消息模拟
* @author luoweifu
*/
public class MessageSimulator {
//消息队列
private static ArrayBlockingQueue messageQueue = new ArrayBlockingQueue(100);
public static void main(String[] args) {
WindowSimulator generator = new WindowSimulator(messageQueue);
//产生消息
generator.GenerateMsg();
//消息循环
Message msg = null;
while((msg = messageQueue.poll()) != null) {
((MessageProcess) msg.getSource()).doMessage(msg);
}
}
}

这里模拟用例中只有一个消息输入源,且是一种线程阻塞的,只有输入结束后才会进行消息的处理。真实的Windows操作系统中的消息机制会有多个消息输入源,且消息输入的同时也能进行消息的处理。

本文地址: http://www.linuxprobe.com/program-message.html编辑员:郝大发,审核员:杨鹏飞

编程”灵魂之心“之消息机制相关推荐

  1. 【转】编程思想之消息机制

    从一个剧情开始 路遥的<平凡的世界>因为翻拍成电视剧,又再次火起来了!我们就从这里开始吧,其小说是以这样一个场景开头的: 在一个半山腰县立高中的大院坝里,在一个校园内的南墙根下,按班级排起 ...

  2. 非阻塞模式WinSock编程入门(Socket关联窗口消息机制)

    本文版权归 CSDN trcj 所有,转载请自觉按如下方式于明显位置标明原作者及出处,以示尊重! 作者:trcj 原文:http://blog.csdn.net/trcj1/archive/2010/ ...

  3. 利用消息机制实现.NET AOP(面向方面编程)--基本概念和实现

    本系列文章主要讲述如何利用.NET的Remoting消息框架实现AOP 本系列文章试图实现三种AOP实现 本系列文章以示例代码为主,对一些概念和原理不会进行过于深入的讨论 这里不谈论AOP在现实开发中 ...

  4. mfc编程消息机制中消息汇总

    做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下 WM_CREATE CreateWindow 初始化工作 GetMessage 遇到WM_QUIT,程序结束 Dispatc ...

  5. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  6. windows消息机制深入详解-1

    Windows 是一个事件驱动的操作系统.事件驱动围绕着消息的产生与处 理展开,事件驱动是靠消息循环机制来实现的.也可以理解为消息是一种报告有关事件发生 的通知,消息是Windows 操作系统的灵魂. ...

  7. windows消息机制详解-3

    1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...

  8. EJB与JAVA BEAN_J2EE的异步消息机制

    EJB与JAVA BEAN_J2EE的异步消息机制 EJB与JAVA BEAN的区别 Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个 ...

  9. windows程序消息机制(Winform界面更新有关)--转

    1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...

  10. 浅析Android中的消息机制

    在分析Android消息机制之前,我们先来看一段代码: [java] view plaincopy public class MainActivity extends Activity impleme ...

最新文章

  1. Elasticsearch 如何做到快速检索?
  2. 时间戳类型的字符串 {Timestamp@15601} “2021-07-14 18:56:53.0“ 变成带T的Object类型 2021-07-14T10:56:53.000+0000 处理
  3. android中开启线程处理,Android线程与消息处理
  4. 利用指针编程实现:删除一个字符串中的所有空格 c语言,C语言必考100题解析汇报...
  5. Hyperledger Fabric 2.2.1 区块链问题汇总(持续更新)
  6. 【立即报名】解码AI大杀器:华为云GPU+Tensorflow 容器实战
  7. 目标检测之Selective Search原理简述(转)
  8. 选择Eclipse 的列编辑模式
  9. python实现画板功能并操作数据库
  10. 局域网文件共享手机访问电脑文件软件
  11. 泛泰A860 Andorid4.4.3 KTU84M (Omni) 图赏
  12. 小谈 Ubuntu 联网
  13. Java学习---day07_继承及final、Object的介绍
  14. 华为云微认证考试简介
  15. 1008: 美元和人民币 C语言
  16. 市场同类产品对比分析
  17. 1080p60Hz需要传多少数据,怎么计算显示器带宽?(二)
  18. 2022年起重机械指挥特种作业证考试题库模拟考试平台操作
  19. 没学历的IT人生没那么悲催,献给程序员们
  20. 苹果WWDC 2020 笔记及广告洞察

热门文章

  1. OpenGL Frame Buffer Object (FBO)
  2. PS之如何直接提取其他窗口或网页颜色
  3. UT-FT-ST测试
  4. Factor Graphs and GTSAM
  5. 天地三才阵——【Java三大特征】
  6. VUCA的复杂性——业务架构真正的挑战
  7. 质量团队在VUCA时代如何走?
  8. Openjudge1.5答案
  9. html单标签和双标签汇总
  10. 在业务规则中使用OR有何不妥?