最近,遨游,世界之窗等浏览器相继推出了防假死功能,然后"防假死"的话题似乎一下就热了起来,弄得我也想搞一个来玩玩.
很久以前就知道,好像是要搞什么多线程之类的才能实现这个"防假死"功能.网上找了一下,于是看见了"敖有志"上面的一篇帖子,"也谈防假死",肯定了我的想法.那么vb怎样实现多线程呢?可以有两种实现方式:
- api的CreateThread
- vb的Activex EXE
网上有不少关于方法1的例子,似乎能行,但尝试了后发现无法使用vb内置的form,当然还有其他的一些限制,另外,这样使用确实不太安全,很容易崩溃.最后我选择了方法2.方法2的实现方法是:
- 新建一个Activex EXE工程,然后在工程属性中选"Thread per Object"
- 创建对象的时候使用CreateObjcet而不是New
- "Start Mode"选"Standalone"
似乎一切都很好了,但如果勾选了1,那么是不能使用MDI窗口的,这样一来,我的LE就用不了这个了.怎么办?没关系,将相关代码独立出来,做成一个Activex EXE组件,供主程序调用即可.
主程序启动->调用外部组件,创建了新的线程->将webbrwoser放在子窗体中,然后完成,确实这样就行了吗?于是进入测试网站 http://www1.pconline.com.cn/pcedu/specialtopic/maxthon25/freeze/index.htm,结果是死翘翘...
后来发现,新线程中的窗口是不能作为主程序的子窗口的(child),也就是说,主程序的窗口必须与webbrowser所在的窗口是分离的.如果这样做的话,这将是个很怪的界面设计,另外还有花费不少代码去处理子窗口的位置大小,使之能与主窗口配合.
是不是有更好的办法?突然想起了"也谈防假死"上说的Maxthon是"采用页面分离技术",难道就是上面的那个方法?验证一下吧.
经测试,Maxthon确实就是这样处理的,它的页面所在的窗口与主窗口是分离的,另外发现"世界之窗"也同样是这样处理的,那么我的LE也可以这样做了.
准备推出具备防假死功能的LE 0.7...
一些问题
参考资料:
- 也谈防假死(http://blog.maxthon.cn/?p=317)
- A Thread to Visual Basic: Multi-Threading In VB5 and VB6(http://www.freevbcode.com/ShowCode.Asp?ID=1287)
- 《高级VisualBasic编程》