防假死,vb多线程,以及在自编浏览器中的实现

前端之家收集整理的这篇文章主要介绍了防假死,vb多线程,以及在自编浏览器中的实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近,遨游,世界之窗等浏览器相继推出了防假死功能,然后"防假死"的话题似乎一下就热了起来,弄得我也想搞一个来玩玩.

很久以前就知道,好像是要搞什么多线程之类的才能实现这个"防假死"功能.网上找了一下,于是看见了"敖有志"上面的一篇帖子,"也谈防假死",肯定了我的想法.那么vb怎样实现多线程呢?可以有两种实现方式:

  1. api的CreateThread
  2. vb的Activex EXE

网上有不少关于方法1的例子,似乎能行,但尝试了后发现无法使用vb内置的form,当然还有其他的一些限制,另外,这样使用确实不太安全,很容易崩溃.最后我选择了方法2.方法2的实现方法是:

  1. 新建一个Activex EXE工程,然后在工程属性中选"Thread per Object"
  2. 创建对象的时候使用CreateObjcet而不是New
  3. "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...

一些问题

  1. 采用外部ActivexExe的时候,程序就变得不那么绿色了,必须注册了组件才能用,这个暂时没办法,只能在程序退出的时候反注册一下
  2. 其实是使用了2个进程来实现,不太完美,资源消耗可能也大

参考资料:

  1. 也谈防假死(http://blog.maxthon.cn/?p=317)
  2. A Thread to Visual Basic: Multi-Threading In VB5 and VB6(http://www.freevbcode.com/ShowCode.Asp?ID=1287)
  3. 《高级VisualBasic编程》

猜你在找的VB相关文章