hsy75的个人空间 https://blog.eetop.cn/vivilife [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

[z]基于fusion的DirectFB消息流

已有 2933 次阅读| 2012-9-25 18:53 |个人分类:linux

  

在传统的DirectFB应用中,所有的应用程序都在一个进程中,在性能上,有一些优势,然而一个应用程序不稳定会造成整个系统的不稳定。若采用C/S模型,无疑是重蹈X Widnow的覆辙,会丧失性能上的优势。

所以DirectFB采用了另外一种方式,与C/S相区别,称之为主从模型(Master/Slave)。它加了一个称之为fusion的内核模块。Fusion是熔化的意思,多个应用程序在不的进程空间里,通过这个内核模块通信,在这里,一切都溶为一体了。Master应用程序负责初始化一个称为竟技场的东西,其它Slave应用程序可以加入或者退出竟技场。当Master退出时,则其它所有Slave都必须退出。

Fusion里采用了Reactor模式,每个应用程序可以通过ioctl向reactor注册事件处理器,当有事件发生时,reactor会把事件写入到所注册了的应用程序的fusion文件描述符时,之后应用程序可以从fusion文件描述符里读取到事件数据。

当然,应用程序也可以通过ioctl发送事件给其它应用程序,reactor时会把事件分发给其它应用程序。

下面以触摸屏为例介绍笔点事件的过程:

1. 初始化时,driver_open_device创建一个进程,挂在/dev/input/event0上,等待笔点事件。

2. 初始化时,应用程序创建另外一个线程,挂在/dev/fusionN(不同的应用程序N值不同)上。

3. 当有笔点事件时,通过函数调用dfb_input_dispatch–>fusion_reactor_dispatch->ioctl (FUSION_REACTOR_DISPATCH)把消息丢给内核模块。

4. 内核模块中的Reactor把事件数据写入到各个所注册的事件处理器的/dev/fusionN里。

5. 应用程序从/dev/fusionN文件中取得事件数据,并调用应用程序内部的reactor处理函数,一般是IDirectFBEventBuffer_InputReact/IDirectFBEventBuffer_WindowReact两个函数。

6. 然后,在IDirectFBEventBuffer_InputReact/IDirectFBEventBuffer_WindowReact两个函数中,调用IDirectFBEventBuffer_AddItem把事件加入到窗口的事件队列中。

7. 在应用程序的主线程中,就可以通过调用窗口的GetEvent函数从事件队列中获取事件了,最后,把获取的事件分发到各个窗口事件处理函数中。


ref:

http://blog.sina.com.cn/s/blog_684bb6fb0100jasj.html

 


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 1

    好友
  • 2

    获赞
  • 14

    评论
  • 3241

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 15:16 , Processed in 0.010884 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部