« 1 2345» Pages: ( 1/6 total )
本页主题: [原创]SWT: 深入内幕之消息机制探秘 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

treenode

状态: 离线
级别: CEC高级程序员
精华: 2
发帖: 46
威望: 16 点
财富: 295 元
在线时间:3(小时)
注册时间:2005-11-21
最后登录:2008-04-03

[原创]SWT: 深入内幕之消息机制探秘

本文记录的是我这几天研究SWT事件机制底层实现原理的一些心得,为此还引用了大量的JNI代码。单纯以使用SWT为目的的程序员大概不会对此感兴趣。不过,对“内幕”一类东西有强烈好奇心的则可以一读。因为SWT实现事件处理的手法的确比较有趣,是我在过去的类似界面框架——MFC、WTL和VCL中都不曾见过的。原文见附件。
[ 此贴被treenode在2006年06月04日 01:20重新编辑 ]
描述:SWT.zip
附件: swt.zip (316 K) 下载次数:3542
本帖最近评分记录:
  • 威望:3(yy2008)
  • 财富:15(yipsilon)
  • 顶端 时间: 2006年06月04日 01:06 | [楼 主]
    krf301

    状态: 离线
    级别: CEC程序员
    精华: 0
    发帖: 314
    威望: 15 点
    财富: 1 元
    在线时间:30(小时)
    注册时间:2005-11-28
    最后登录:2008-09-08

    写得很牛。支持。顶到精华。
    顶端 时间: 2006年06月04日 10:25 | 1 楼
    zhangbo198294

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 208
    威望: 11 点
    财富: 461 元
    在线时间:30(小时)
    注册时间:2006-02-25
    最后登录:2007-05-10

    谢谢搂主~~!
    顶端 时间: 2006年06月04日 10:36 | 2 楼
    krf301

    状态: 离线
    级别: CEC程序员
    精华: 0
    发帖: 314
    威望: 15 点
    财富: 1 元
    在线时间:30(小时)
    注册时间:2005-11-28
    最后登录:2008-09-08

    swt的原代码中有不少.h .c之类的代码,猜测可能就是本地方法的c语言代码,但也未曾打开来看过。
    经作者这样一分析,对swt的实现机制又多了解了一点,在此感谢楼主的大作。
    顶端 时间: 2006年06月04日 11:38 | 3 楼
    泽牛内尔

    状态: 离线
    级别: CEC程序员
    精华: 0
    发帖: 284
    威望: 0 点
    财富: 6 元
    在线时间:11(小时)
    注册时间:2006-04-05
    最后登录:2008-06-30

    知其然更要知其所以然
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    世上无难事,只怕有心人!
    顶端 时间: 2006年06月04日 15:36 | 4 楼
    jossonsmith

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 3
    威望: 1 点
    财富: 103 元
    在线时间:0(小时)
    注册时间:2006-06-05
    最后登录:2006-06-05

    提点问题: 由于SWT也有所谓的Thread问题,如果简单地跨线程调用SWT控件的话,肯定出错。文中开始部分提及VCL/ATL对跨线程调用控件的不同方式,我倒是蛮感兴趣的;另外SWT的实现为什么会有Thread的问题,是否SWT对此有特别的需求才保留Thread跨线限制呢?

    不知道treenode有没有更好的分析心得分享?
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Rec.ognize me?
    C.ognize yourself?
    顶端 时间: 2006年06月05日 07:37 | 5 楼
    treenode

    状态: 离线
    级别: CEC高级程序员
    精华: 2
    发帖: 46
    威望: 16 点
    财富: 295 元
    在线时间:3(小时)
    注册时间:2005-11-21
    最后登录:2008-04-03

    答楼上,其实在我所知道的所有界面框架中,如果直接通过线程调用的话,基本上都会有问题。因为线程的执行是完全异步的,你永远不能确定这个线线程何时暂停,那个线程何时启动。而且框架的的设计者大多有这样的共识:如果所有界面元素加上同步控制,需要太多的开销,在性能上是不可以接受的;并且界面处理中需要同步的点并不算很多,需要的时候交由程序员来处理,这是合理的。

    VCL跨线程传送对象指针是没有问题的,但是VCL也并不是Thread-safe,如果要从线程中更新界面,安全的方法是调用TThread.Synchorize方法。VCL的实现也比较有意思,简单的说,它创建了一个隐藏的窗口,TThread.Synchorize实际上是向这个窗口发了一条消息,然后这个窗口再把消息内容翻译为原来的方法。由于隐藏窗口和其他窗口都在同一个线程中,所以没有同步问题。

    ATL则是一个相对原始的框架,本身基本上没有提供同步方法,需要的时候使用底层的Windows API创建操作系统级的核心对象来处理同步问题。

    MFC的问题比较严重,是因为程序员习惯于在线程之间传递对象。如果按照MFC的要求,必须把对象还原成Native Handle才能传递,很多人都觉得太过麻烦,能省事就省事了。

    SWT应该没有什么特别的需求,它的实现也有些类似于VCL(应该更像WinForm,不过这个东西我没有研究,只是用法上觉得更接近),传递对象是可以的,但是更新界面的时候还是需要注意同步的问题。
    顶端 时间: 2006年06月05日 19:02 | 6 楼
    twelve

    头衔:豫中 豫中
    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 195
    威望: 12 点
    财富: 119 元
    在线时间:7(小时)
    注册时间:2006-04-07
    最后登录:2007-01-11

    看看先
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    感谢帮助我的人,感谢那些热心的人...
    顶端 时间: 2006年06月05日 22:07 | 7 楼
    why91

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 9
    威望: 11 点
    财富: 209 元
    在线时间:1(小时)
    注册时间:2006-04-19
    最后登录:2006-08-28

    看看先
    顶端 时间: 2006年06月13日 16:41 | 8 楼
    dzhxie

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 66
    威望: 1 点
    财富: 174 元
    在线时间:0(小时)
    注册时间:2006-06-22
    最后登录:2007-11-15

    看看先
    顶端 时间: 2006年06月28日 09:38 | 9 楼
    zf00110011

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 37
    威望: 1 点
    财富: 146 元
    在线时间:0(小时)
    注册时间:2006-05-18
    最后登录:2006-07-19

    看看先
    顶端 时间: 2006年07月06日 09:42 | 10 楼
    jossonsmith

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 3
    威望: 1 点
    财富: 103 元
    在线时间:0(小时)
    注册时间:2006-06-05
    最后登录:2006-06-05

    Quote:

    VCL跨线程传送对象指针是没有问题的,但是VCL也并不是Thread-safe,如果要从线程中更新界面,安全的方法是调用TThread.Synchorize方法。VCL的实现也比较有意思,简单的说,它创建了一个隐藏的窗口,TThread.Synchorize实际上是向这个窗口发了一条消息,然后这个窗口再把消息内容翻译为原来的方法。由于隐藏窗口和其他窗口都在同一个线程中,所以没有同步问题。


    有点双缓冲的味道。

    看来Thread对UI来说难以做到彻底的透明。
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Rec.ognize me?
    C.ognize yourself?
    顶端 时间: 2006年07月07日 15:27 | 11 楼
    bluejerry

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 9
    威望: 1 点
    财富: 109 元
    在线时间:0(小时)
    注册时间:2006-07-07
    最后登录:2006-07-09

    看了,可是一时不明白啊。
    顶端 时间: 2006年07月07日 15:42 | 12 楼
    wts173

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 5
    威望: 1 点
    财富: 105 元
    在线时间:0(小时)
    注册时间:2006-06-20
    最后登录:2006-07-09

    thks
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    重剑无锋,大巧
    顶端 时间: 2006年07月09日 18:54 | 13 楼
    likerain

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 41
    威望: 11 点
    财富: 246 元
    在线时间:1(小时)
    注册时间:2006-02-28
    最后登录:2006-10-22

    顶端 时间: 2006年08月18日 12:35 | 14 楼
    mark_wang

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 1
    威望: 1 点
    财富: 101 元
    在线时间:0(小时)
    注册时间:2006-07-24
    最后登录:2008-07-25

    牛人
    顶端 时间: 2006年08月26日 13:33 | 15 楼
    s_zhchluo

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 14
    威望: 1 点
    财富: 114 元
    在线时间:0(小时)
    注册时间:2006-06-28
    最后登录:2006-09-26

    想卡那,不过下不了
    顶端 时间: 2006年09月08日 20:23 | 16 楼
    giianhui

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 15
    威望: 1 点
    财富: 115 元
    在线时间:0(小时)
    注册时间:2006-09-07
    最后登录:2007-01-04

    thanks
    顶端 时间: 2006年09月18日 21:26 | 17 楼
    feather2005

    头衔:Java工程师 Java工程师
    状态: 离线
    级别: CEC中级程序员
    精华: 0
    发帖: 76
    威望: 11 点
    财富: 82 元
    在线时间:0(小时)
    注册时间:2006-04-01
    最后登录:2008-07-15

    这个有帮助,目前正好在研究SWT的实现机制
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    野有蔓草,零露清兮.有美一人,清扬婉兮.邂逅相遇,适我愿兮.
    顶端 时间: 2006年09月19日 00:29 | 18 楼
    implements

    状态: 离线
    级别: CEC高级程序员
    精华: 0
    发帖: 3
    威望: 1 点
    财富: 103 元
    在线时间:0(小时)
    注册时间:2006-09-20
    最后登录:2006-11-16

    好东西当然要顶。
    顶端 时间: 2006年09月20日 13:57 | 19 楼
    « 1 2345» Pages: ( 1/6 total )
    中国Eclipse社区 » 插件开发
    

    辽ICP备05021625号