GeoGeo Master-Slave窗口事件

来源:互联网 发布:经济学推荐书籍 知乎 编辑:程序博客网 时间:2024/06/16 03:39

 

GeoGeo Master/Slave窗口事件

 

GeoGeo分布式计算的另一目标是实现大数据集可视化。地学空间数据有空间分布广和数据量大的特征,仅在单一的可视化设备中展示和观察这样庞大的数据无异于管中窥豹。多Slave机在解决后台计算任务之余,由多Slave机构成大规模显示矩阵也是大数据集可视化的可行解决方案之一。

GeoGeo不仅在Master本机可以实现窗口和事件驱动机制,也可以在Slave机本机实现事件驱动机制。在Slave机本机实现窗口和事件驱动其实很简单,只需将Master机的同样的窗口和事件函数迁移到Slave机上即可实现。

不仅如此,GeoGeo还可以实现MasterSlave机之间的事件触发和响应机制。

设计MasterSlave机之间的事件驱动的理由之一是大规模显示矩阵的联动。例如,显示矩阵的一个显示单元由Slave本机事件发生了显示滚屏,Master机就必须响应该事件并向所有其它 Slave机发送滚屏消息触发该事件,这样才能保证显示矩阵展示内容的连续性。

一、创建窗口

创建窗口使用 CreateWindow函数。可以用如下代码创建一个窗口。

main(){

       int nID = CreateWindow("新建窗口",2);

}

GeoGeo同时提供了窗口的设置移动和销毁等管理窗口的函数。

Slave机上创建窗口仅需将上述代码作为过程进程在Slave机上启动。其它管理窗口的函数也同样可以写在过程进程中实现和Master机同样的窗口管理功能。

二、Slave通知Master有事件触发

Slave机有事件触发时,一些事件被忽略,一些在本机由事件响应函数处理,还有一些被发送到Master机进行处理。迁移到Slave机上的过程代码中,如果没有该事件的事件响应函数,则该事件被忽略。如果有事件响应函数则该事件由Slave响应,并同时将该事件发往Master机,如果Master机有Slave机的该事件响应函数,则Master机也处理该事件,否则被忽略。如果不希望Slave机处理该事件,但希望由Master机处理,可以在Slave机设置一个哑函数,则该事件被发往Master机处理。例如,Slave端代码如下

main(){

       CreateWindow("新建窗口",1);

       CreateWindow("新建窗口",2);

}

event OnLButtonDown(){

}

OnLButtonDown即为一个哑函数。有了这个哑函数,WM_LBUTTONDOEW消息被发送往Master机。

三、Master的消息响应函数

Master端对来自Slave端消息的消息响应函数的函数名比本机的消息响应函数多加了“Slave”字样,例如,本机对鼠标左键按下的消息响应函数为OnLButtonDown,但对Slave机发来的鼠标左键按下用OnLButtonDownSlave函数。

对应上述的Slave端的哑函数,Master端的过程写为:

main(){

       ProcessBegin();

       ProcessCall("G:\\ 9-40-哑函数.c");

       Sleep(10000);

       ProcessEnd();

}

event OnLButtonDownSlave(int row,int col,int winID,int x,int y,int flag){

       Print("%d %d 列节点机窗口%dx=%d y=%d位置鼠标左键按下",row+1,col+1,winID,x,y);

}

Slave端创建2个窗口,在任何窗口点击鼠标左键,Master端的OnLButtonDownSlave都会响应。函数的参数同时指明了哪行哪列的Slave机的哪个窗口发生了鼠标左键按下事件,并且指出了鼠标按键的坐标以及键盘功能键的按键信息。

四、向Slave发送消息

Slave机发送消息是很容易的事情,因为这种多机运行机制基本是消息驱动的。向Slave机发送消息使用SendMessageSlave函数

int SendMessageSlave(int row, int col, int winID, STRING msg)

该函数的参数指定了接收该消息的Slave机的行列和窗口,然后发送消息本身和附加参数。

SendMessageSlave函数向Slave发送的消息不仅可以是预定义的内建消息,也可以是自定义的消息。这些自定义的消息通常是一个由GGM_开头的大写的串。

五、Slave消息响应

Slave机接收到Master发来的消息后,如果是预定义的消息,则直接查找对应的消息响应函数。如果Master发送来的是自定义消息,Slave应该与Master预先有一个约定,进行消息映射。Slave端的消息映射使用MapMessage函数,例如

MapMessage("GGM_NEWBITMAP","OnGGNewBitmap");

这个函数的意思是当有GGM_NEWBITMAP消息进入时,函数名为OnGGNewBitmap的消息响应函数响应该消息。也就是书写一个名为OnGGNewBitmap的消息响应函数响应来自Master机的GGM_NEWBITMAP消息。

更多关于Master/Slave消息驱动内容见《GEOGEO-PART1GeoGeo脚本基础第9章第9节分布式窗口与事件。

示例程序清单中9-39~9-42提供了有关分布式窗口与事件的示例代码以供参考。

 

 

http://download.csdn.net/detail/gordon3000/7922555

 

0 0