SWT: 深入内幕之消息机制探秘

       最近做项目中遇到了这样的问题:在EclipseRCP中嵌入浏览器,浏览器中链接的是项目中的地图,现在要在RCP中实现点击地图中的某一点,打开对应的RCP中的模块,试过了
       1、使用socket通信,当地图点击某一点时通过socket向cs发送一条指令,指令中包含地图中这一点的相关信息,cs在收到指令后作出相应的处理,打开对应的模块,但是由于swt中线程的问题,老是报错,想了很多方法都无法解决,所以就觉得也许是自己这方面学的太浅了,哈哈!
       2、读文件
       3、读数据库
      由于2、3解决起来效率很慢,并且浪费资源,所以这个问题到现在也没有解决,哈哈!继续努力!
      今天在 中国Eclipse社区 上看到这样一片帖子,写的是研究SWT事件机制底层实现原理的一些心得,觉得写的很牛并且对我研究和解决上述问题有很大帮助,于是决定引用一下,哈哈!
      http://www.eclipseworld.org/bbs/read-cec-tid-5132.html
 
      (提点问题: 由于SWT也有所谓的Thread问题,如果简单地跨线程调用SWT控件的话,肯定出错。文中开始部分提及VCL/ATL对跨线程调用控件的不同方式,我倒是蛮感兴趣的;另外SWT的实现为什么会有Thread的问题,是否SWT对此有特别的需求才保留Thread跨线限制呢?

      答楼上,其实在我所知道的所有界面框架中,如果直接通过线程调用的话,基本上都会有问题。因为线程的执行是完全异步的,你永远不能确定这个线线程何时暂停,那个线程何时启动。而且框架的的设计者大多有这样的共识:如果所有界面元素加上同步控制,需要太多的开销,在性能上是不可以接受的;并且界面处理中需要同步的点并不算很多,需要的时候交由程序员来处理,这是合理的。
      VCL跨线程传送对象指针是没有问题的,但是VCL也并不是Thread-safe,如果要从线程中更新界面,安全的方法是调用TThread.Synchorize方法。VCL的实现也比较有意思,简单的说,它创建了一个隐藏的窗口,TThread.Synchorize实际上是向这个窗口发了一条消息,然后这个窗口再把消息内容翻译为原来的方法。由于隐藏窗口和其他窗口都在同一个线程中,所以没有同步问题。
      ATL则是一个相对原始的框架,本身基本上没有提供同步方法,需要的时候使用底层的Windows API创建操作系统级的核心对象来处理同步问题。
      MFC的问题比较严重,是因为程序员习惯于在线程之间传递对象。如果按照MFC的要求,必须把对象还原成Native Handle才能传递,很多人都觉得太过麻烦,能省事就省事了。
      SWT应该没有什么特别的需求,它的实现也有些类似于VCL(应该更像WinForm,不过这个东西我没有研究,只是用法上觉得更接近),传递对象是可以的,但是更新界面的时候还是需要注意同步的问题。)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值