有问题的rclock和最简单的IPC

                            有问题的时钟

   在把玩虚拟机中的menuetos32过程中,发现一个小问题。但点击底部右侧的时间显示时,多次点击,就会出现圆形时钟,但无法关闭,如下图所示:

底部的任务栏出现了多个RCLOCK图标。当然,圆形时钟都处于同一个位置。

点击左边的菜单按钮,出现一级菜单,如不选择,再次点击左下角的按钮,菜单消失。能不能在右侧点击时也实现同样的功能呢?

查看mpanel的代码,发现:

但点击左侧最小边的按钮时,检查了一下是否有MDM,也就是菜单项。如果有,则给MDM发出‘T’的IPC消息,MDM接受到此消息后,退出程序 。

而点击右侧最下边时间显示时,则是需要检查鼠标位置,然后调用rclock。并没有检查是否存在运行中的rclock。 代码如下:

上述代码是在检查鼠标位置是否在右侧最小角的时间显示方框内,如果是,则调用rclock,显示圆形时钟。

查看mpanel和mdm代码,仿照其代码,使用IPC方式关闭rclock。

rclock中代码如下:

在start初始化代码中, 通过60调用,将ipcarea地址送入。

在rclock事件循环中,查看地址中,是否有消息。如果没有,则继续等待事件。如果有,则调用-1,rclock退出。

在mpanel中,则检查完位置后,查看是否有clockpid值:

一开始,值为0,则表示没有rclock。当调用了rclock后,通过系统调用9,获取pid,并保存在clockpid中,以便下次点击时跳转中close_rclock,发出IPC消息。

这样,就简单实现了启功圆形时钟和关闭圆形时钟的功能。

在内存图中,和IPC有关的位置如下:

 

总结:

1. IPC的机制为,先将接收方地址传入,然后等待消息传入并检查。发送方确定接收方pid,发送消息。

2. 这么做的原因是为了更好的理解菜单选择时的代码。

3.编译mpanel, 使用:fasm mpanel.asm mpanel

   编译rclcok,   使用 :fasm rclock.asm rclock

 

posted on 2024-12-30 20:56  oemwang  阅读(9)  评论(0)    收藏  举报

导航