cyantree's blog

c/linux/video/audio

导航

<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜

在ocx中的worker thread中触发事件,vb调用时会崩溃

  这个操蛋的问题要从一年前说起,当初做无线点菜,PC端的接口是用C写的,提供的是lib/dll方式。有些客户惯于使用的是vc或delphi,这 些都很方便,但是某些客户使用的是vb和pb,问题就来了。pb因为我并不熟悉,所以没有多管,vb一开始打算用的是dll,但是发现一触发事件就崩溃, 在网上找了很久,发现问题出在事件触发是在thread中的,vb属于线程不安全的类型,所以一触发就崩溃,但是我又不能更换模型,后来写了一个ocx的 版本,但是问题依旧,于是就搁置下来了,一直以来都是用delphi或vc做接口的,好在都是老客户,用delphi和vc写的接口还没有人发表过意见。

  今年这个版本已经相当完善,而且由于某些原因,开始做通用的802版本,所以需要支持更多的新用户,也因此意味着一定会遇到vb和pb的用户,不能让这些用户限定在delphi和vc的ide下,这是不行的,于是ocx的问题又一次摆在眼前。

  国庆节重写了ocx,基本上没有什么问题,但是因为没有设备,所以没有测试事件,前两天终于开始测试,让progame同志帮忙写了一个vb的测试程序,这就开始了。结果一开始就发现问题依旧,没办法,只好求助于网络,七拐八弯的终于发现了下面的网址:
  http://vcfaq.mvps.org/com/1.htm
  Why does my VB client keep crashing when compiled and not in the IDE when I use an ActiveX Control with a worker thread?
  这不就是我的问题么!

  原因倒也解释的很清楚:
You probably fire events from the worker thread in your control. Since all ActiveX Controls live in single-threaded apartments, the event sink your VB client supplies lives in that STA too. VB operates in apartment model only, hence the pointer for the event sink is in fact a direct pointer to the object in VB. Hence you are able to call through this pointer. Unfortunately, by doing so you violate the COM threading rules - every interface pointer is valid only within the apartment it is obtained in. Since VB is not thread-safe - you experience the crash.
  说到底,还是vb比较烂,not thread-safe.....

  解决办法也很多,列了三条:1、创建一个隐藏的window,然后postmessage上去 2、重写ATL的IConnectionPointImpl::Advise和Unadvise 3、从第二条上衍化出来的办法,更换线程模型
  因为原文太多,就不贴了。

  当时看到这个的时候已经很晚了,实在没精力折腾了,于是就在痛苦中睡觉去了。

第二天,也就是昨天,仔细研究了一下文档,再看了一下后面列的连接,决定还是用第一种方法,简单、快捷,虽然有点难看。这个折腾啊,一天下来就在 postmessage中转悠,一直弄到夜里三点才算完事。今天一早做了完整测试,终于通过了!从此VB不再成为障碍,我也松了一口气。

个人感觉,vb实在属于比较玩具级的开发工具,总觉得是一种没有设计完整的工具,似乎是很多思想、流派的大杂烩,先进是先进了,但是不够精确,方便是方 便了,但是有一种关起门来自娱自乐的味道,别的语言很难和VB进行沟通,以前玩delphi的时候觉得delphi和C的世界很有点隔阂,但好歹还算可以 互通,但vb实在让我大跌眼镜,基本上就是一个土财主的味道,只要自己爽就好,根本不管外面的世界是什么样的。

  牢骚发完了,心气也平了,the end.....

2006-10-10 17:46

ps:老文档,不过还算有点参考意义

posted on 2007-08-22 05:00 cyantree 阅读(1097) 评论(1)  编辑 收藏 引用

只有注册用户登录后才能发表评论。