最新发表文章

用Timer控件再VB中来模拟线程
作者: jameswang   发表日期: 2006-03-06 21:35   复制链接


下文是本人在公司技术月刊发表的一片文章。

前几周,OceanRay在论坛中问了关于vb中实现线程的问题。当时我比较忙,只是匆匆给他找了一点参考资料。当巴乔找到我,让我为第一期电子月刊写一篇windows专题的时候,我首先想到了OceanRay的问题。当时,我踌躇满志地想花点时间,写出一个真正有效的VB的多线程例子。最后还是放弃了。果真如Daniel Appleman所说,尽管VB允许调用Windows API来做一些高级工作,但是,在VB中使用线程相关API是十分危险的。几个小时的程序调试,换来的是不停的莫名其妙的内存访问错误。因为我比较缺乏线程编程经验,不得已,换了一个简单一点的题目。  p旣b  
在网上粗略地搜了一下,发现虽然有很多代码介绍了用Timer控件来实现动画效果,但是好像没有人试图用Timer控件来模拟线程。即便有相关的讨论(参考文献[3]),也存在很多质疑。根据以前项目的经验,我写了一个小例子,用VB的Timer控件来模拟多线程。 岘靈紟{瞳  

1.什么是多线程?多线程比单线程“快吗”? R{N_a  
线程是操作系统运行程序的基本单元。单线程是指一个程序在一个线程中运行。多线程是指一个程序启动多个线程来“同时”执行代码片断。请注意这里的同时是加了引号的。因为那是人类的错觉而已。对于一个单CPU的计算机,根本不存在“同时”这个概念。因为同一时间点,CPU只能执行某个线程的一个指令。举个例子,你打算在程序中做10件相同的任务。如果每个任务要花费1秒。那么,在单线程程序中,总共花费的时间就是10秒。如果用户通过点击按钮来启动任务,那么,他就必须在10秒钟之后才能使用这个程序的其他功能。假如你把10件任务放在10个线程中来执行,效果完全不同了。操作系统会花费了1秒钟在这些线程之间进行调度。那么,所有任务执行所用的时间就是11秒。由于使用了多线程,用户点击按钮之后可以马上使用其它功能。所以,在运行时间上,多线程要比单线程慢。但是,在用户响应时间上,多线程遥遥领先。

2.Timer控件是在创建另外一个线程来执行代码的吗? `Y-痠B  
回答是否定的。让我们来看个例子就知道了。

Private Sub Timer1_Timer(Index As Integer) Okr(G頦  
    Dim i As Long 剉7Oa$n  
    For i = 0 To 100000 f 朷89e歩  
        ‘DoEvents 3fL0命  
        Text1.Text = CStr(i) 盨鄚锱=  
    Next i 0;d酝  
End Sub

Timer1的Timer事件函数中,有一个大循环。

Private Sub Command1_Click() (嶹䲠殗  
    MsgBox "Interrupted!" 輵 |椀/;  
End Sub

K狽e壇;  
代码1

腑r荋 迤炪  
当Timer开始运行后,我们点击Command1,画面没有反应。当Timer1一次执行完毕之后,消息框突然弹了出来。 :拁 w  
结论:VB的代码都是运行在一个线程之中的。Timer控件也不例外。我们还可以做一个实验证明Timer并不是使用多线程。将Timer1的Interval属性设置为1(相当于1毫秒),结果,Timer1并没有一秒钟执行了1000次。实际的Interval是大循环执行所花费的时间。

3.DoEvents——VB的“软中断” <釘V郙n  
当我们把代码1中DoEvents的注释去掉后,发现程序的表现不一样了。循环开始后,画面依然响应用户的动作。当点击Command1时,消息框立即弹出,Timer1的事件也立刻停止执行。当消息框关闭后,Timer1的时间又恢复执行。 $棤t欗确  
结论:VB中的DoEvents关键字与线程中的Suspend或者Sleep的作用很相似。都是让当前代码段让出CPU时间给其他代码。不同之处在于线程是操作系统低层的支持,效率高;而DoEvents是利用windows的消息系统实现的“软中断”。

4.多Timer对多线程 T/紬谪S=  
通常的多线程程序,都创建不止一个线程。为了模拟真正的多线程,我们需要在代码中动态增加Timer的数量。

Private WithEvents newTimer As VB.Timer c―へ夠臊  
…… )7椏LFF登  
Set newTimer = Controls.Add("vb.Timer", "Timer2", Form1) 輆64  
…… *Y鹟紗7  
Private Sub newTimer_Timer() 5撵抜Q擠鑪  
End Sub 喛羈/m  
……

K }鋜跩  
代码2

通过如上方式,我们可以在Form1中动态添加Timer2。虽然,每个Timer执行的代码逻辑都可以不同,但是,由于所有的逻辑事先写好,所以不能实现真正的动态添加。后来,我找到了参考文献[4]中的代码,感觉可以实现真正的动态添加。遗憾的是时间仓促,没有来得及实践。

Private Sub Timer1_Timer() eQ>G  
    work Timer1.Name 阝闭餻f9  
End Sub

Private Sub newTimer_Timer() d+ぞq {*  
    work newTimer.Name 6n)戱cZ味  
End Sub

Private Sub work(name As String) c7憁  
    Debug.Print "in--------------------------" + name bd!駞榆  
    "锪O蟖C  
    Dim i As Long 槲h≧ 饟  
    For i = 0 To 1000 楮:j廫衲氶  
        DoEvents 1郋 3r  
        Text1.Text = CStr(i) 0琜h64诈u  
    Next i 戈72#@  
    Debug.Print "out-------------------------" + name 硄訥庅骘K  
End Sub

丰J0珮;  
代码3

我在两个Timer事件中调用同一个函数,参数分别是两个Timer的名字。以下是控制台的输出: `5M逗8噁  
…… 漥砥;+  
in--------------------------Timer1 铻欯蝈脤  
in--------------------------newTimer F蔹JM"P:  
out-------------------------newTimer 珵8  
out-------------------------Timer1 偣巳颙Syj  
in--------------------------newTimer }Q蘱协  
in--------------------------Timer1 鲣厺劒饧  
out-------------------------Timer1 `0塂  
out-------------------------newTimer ]Tw|櫾  
in--------------------------Timer1 关嵛 i  
in--------------------------newTimer ^G淏ju蜾  
out-------------------------newTimer 槂A燛瓊#  
out-------------------------Timer1 H"猎⺷  
in--------------------------newTimer 皰Jd箯頾  
in--------------------------Timer1 簢謎沇  
out-------------------------Timer1 窣挄c+  
out-------------------------newTimer 敞l6vg  
in--------------------------Timer1 S筢Z凵  
in--------------------------newTimer 团d猿鏰  
out-------------------------newTimer 串崝6y_  
out-------------------------Timer1 =皘"C啦0I  
……

) s7f茠G  
代码4

结论:通过在VB的Timer控件中灵活使用DoEvents,我们模拟多线程的效果。

5.Timer中的同步 凝泘傚旆剥  
在使用windows线程API的时候,我们可以使用信号灯或者临界区API来进行共享数据的同步。VB中没有这样的机制,需要我们在编程的时候根据信号灯的原理,来设置一些公共变量来充当同步标志。

后记: 谤嗼浡l  
和OceanRay沟通后,了解到他们打算在VB中使用多线程是因为想把一个数据库操作逻辑封装函数放在线程中执行。因为这个函数在执行的时候是阻塞的,导致运行过程中程序不响应用户操作。而且用户还希望随时可以终止这个操作。他们设想如果把函数放在另外一个线程中执行,既可以让程序立即响应用户操作,又可以随时随地通过杀死线程的API来结束操作。这样看来,本文的方法对他们不会有太大帮助。因为如果想终止Timer的执行,必须等待Timer事件的逻辑全部执行完毕之后才行。看来,我们还得想点别的办法。也许,我们可以在下期月刊可以找到答案! 节"<Y/筢  
期待大家的指正!

咕璇錉Z 螺  
参考文献:

[1]A Thread to Visual Basic: Multi-Threading In VB5 and VB6 Daniel Appleman http://www.freevbcode.com/ShowCode.Asp?ID=1287 w蒥召  
[2]《Advanced Visual Basic》 Matthew Curland A殂獫蠰  
[3]http://bbs.gameres.com/showthread.asp?threadid=47556 7$  
[4]http://www.vbsight.com/Zips/ControlArrayAtRuntime.zip '觃馔絢  


阅读全文(3915) | 回复(53) | 推送
欢迎到 jameswang 的个人主页看更多内容



<<   1   2   3   4  >>  Pages: ( 1/4 total )   共53条回复
guest 发表于 2007-05-24 10:09 #1

561bd9e920c71c27e7e52f77bcdaa050 http://primario-chirurgia-policlinico-gemello-roma.sfmyzx.org/ http://immagine-desktop-cartina-fisica-dell-italia.sfmyzx.org/ http://l-importanza-di-essere-onesto.nuusjq.org/ http://america-s-army-trucco-soluzione.pmdxoz.org/ http://fiera-del-tessile-busto-arsizio.lxcjch.org/ http://devhook-0-51-pacchetto-loader.itwasb.org/ http://istituto-clinico-mater-dominio-castellanza.sfmyzx.org/ http://gallery-culo-squarciati-sborrati-com.qumpvr.org/ http://norma-omologazione-ratticidi-presidi-medico.sfmyzx.org/ http://foto-di-donne-nude-grasse.sfmyzx.org/ 7798902e03c54f1db3af807b5937ee1b
返回
guest 发表于 2007-06-06 06:47 #2

721656bdd26b89a29dbb571c2cbfc3bf http://desktop-rosso-honda-nsr-500-2001.jknrtq.info/ http://filippo-de-pasquale-barcellona-pozzo-gotto.qwoucn.info/ http://box-esterno-firewire-e-usb.jknrtq.info/ http://commissione-tributaria-provinciale-di-agrigento.lbvsgo.info/ http://i-quotidiano-piu-letti-in-italia.lbvsgo.info/ http://sottosistema-ms-dos-16-bit.qirjux.info/ http://fiera-moto-2006-rho-milano.duajwe.info/ http://maria-antonietta-dorothy-moulton-mayer.qirjux.info/ http://gioco-psp-harry-potter-calice-fuoco.qirjux.info/ http://bando-corso-offerta-emilia-romagna.yyunae.info/ 11bac96dbb32ab2fd1a6f4018c996a56
返回
guest 发表于 2007-06-12 00:03 #3

a7b3cc6f255336008ada0ab94d38acf4 http://hi-fi-bang-olufsen-palermo.guqsuy.org/ http://frutta-arrostita-www-mistraltour-it.uoyrgt.org/ http://presenza-turistica-parco-delta-po.fkgkox.org/ http://aids-sintomo-modalita-contagio-trasmissione.fkgkox.org/ http://hotel-miravalle-selva-di-val-gardena.fkgkox.org/ http://copertina-cd-miguel-angel-munoz.cckzfi.org/ http://assicurazione-estere-abilitate-rca-italia.cckzfi.org/ http://partigiani-nella-seconda-guerra-mondiale.fkgkox.org/ http://codice-need-four-speed-wanted-psp.uoyrgt.org/ http://lione-institut-d-art-contemporain.cckzfi.org/ 3ebbdc0c5c788c89d957115fc277340d
返回
guest 发表于 2007-07-04 08:52 #4

0fd93ba3f8d3c613389071a24d034085 http://tramalibrofahrenheit451.npxbkv.org/computo-estimativo-edificio-industriale/ http://tramalibrofahrenheit451.npxbkv.org/azienda-agricola-toscana-in-vendita/ http://francochiesa.npxbkv.org/ferrara-cia/ http://francochiesa.npxbkv.org/tastiera-yamaha-303/ http://ristorantijesolo.npxbkv.org/televisore-lcd-sony-klv-l32m1/ http://tramalibrofahrenheit451.npxbkv.org/maurizio-zanardi/ http://testdingressoingegneriainformatica.npxbkv.org/leonardi-alessandro-via-venezia-3-arco/ http://testdingressoingegneriainformatica.npxbkv.org/www-cazzi-grossi/ http://pensionitrieste.npxbkv.org/corsi-recitazione/ http://testdingressoingegneriainformatica.npxbkv.org/www-cazzi-grossi/ 5e5c67b76a0116ee1283d9663bbf46ca
返回
guest 发表于 2007-07-11 06:46 #5

ebce61f554d611282c231a963006166c http://7.ska4aj.com/pagina40.html http://4.ska4aj.org/pagina29.html http://11.ska4aj.net/pagina32.html http://10.ska4aj.net/pagina74.html http://3.skachaj.org/pagina77.html http://22.ska4aj.com/pagina10.html http://23.ska4aj.org/pagina94.html http://18.ska4aj.com/pagina42.html http://14.ska4aj.net/pagina09.html http://25.ska4aj.net/pagina95.html 53f688e2d0ae01a48f96ad8f8181d4f6
返回
guest 发表于 2007-07-19 08:32 #6

a3d8c8283306042a68ece6802852e720 http://cercasi-fashion-designer.iznvge.in/ http://scanderberg.jvzulp.in/ http://capitale-d-italia.jnesky.in/ http://sms-pronto-natale.uylqdg.com/ http://noleggio-camper-lodi.vbglda.com/ http://automatismo-tenda-sole.kvpzig.com/ http://assicurazione-spese-mediche.bkqryo.com/ http://londra-ricerca.iznvge.in/ http://culle-vimini.jvzulp.in/ http://scatti-rubati-sotto-gonna.vbglda.com/ b8a12f78e2ab8d9c8e5e94f78e975725
返回
guest 发表于 2007-09-05 11:20 #7

Hello! Good Site! Thanks you! wpotvxxcnafv
返回
guest 发表于 2007-09-05 11:20 #8

Hello! Good Site! Thanks you! rzchanxelts
返回
guest 发表于 2007-09-05 17:48 #9

Thanks for this site!
<a href=http://dmo.dykib.cn/rrpyuulxhq.html >rrpyuulxhq.html</a>
<a href=http://qub.sqdxi.cn/uzjym.html >uzjym.html</a>
<a href=http://kwd.imweh.cn/lxnk.html >lxnk.html</a>
<a href=http://bgky.lrxby.cn/qdgyipoqn.html >qdgyipoqn.html</a>
<a href=http://rrke.bevll.cn/ozfmumfq.html >ozfmumfq.html</a>
返回
guest 发表于 2007-09-05 17:48 #10

Thanks for this site!
<a href=http://dmo.dykib.cn/rrpyuulxhq.html >rrpyuulxhq.html</a>
<a href=http://qub.sqdxi.cn/uzjym.html >uzjym.html</a>
<a href=http://kwd.imweh.cn/lxnk.html >lxnk.html</a>
<a href=http://bgky.lrxby.cn/qdgyipoqn.html >qdgyipoqn.html</a>
<a href=http://rrke.bevll.cn/ozfmumfq.html >ozfmumfq.html</a>
返回
guest 发表于 2007-09-05 17:57 #11

Thanks for this site!
<a href=http://dmo.dykib.cn/rrpyuulxhq.html >rrpyuulxhq.html</a>
<a href=http://qub.sqdxi.cn/uzjym.html >uzjym.html</a>
<a href=http://kwd.imweh.cn/lxnk.html >lxnk.html</a>
<a href=http://bgky.lrxby.cn/qdgyipoqn.html >qdgyipoqn.html</a>
<a href=http://rrke.bevll.cn/ozfmumfq.html >ozfmumfq.html</a>
返回
guest 发表于 2007-09-05 17:57 #12

Thanks for this site!
<a href=http://dmo.dykib.cn/rrpyuulxhq.html >rrpyuulxhq.html</a>
<a href=http://qub.sqdxi.cn/uzjym.html >uzjym.html</a>
<a href=http://kwd.imweh.cn/lxnk.html >lxnk.html</a>
<a href=http://bgky.lrxby.cn/qdgyipoqn.html >qdgyipoqn.html</a>
<a href=http://rrke.bevll.cn/ozfmumfq.html >ozfmumfq.html</a>
返回
guest 发表于 2007-09-05 19:20 #13

Thanks for this site!
<a href=http://tjk.jqzdf.cn/jofjbzn.html >jofjbzn.html</a>
<a href=http://miti.vsxej.cn/zfff.html >zfff.html</a>
<a href=http://ycpn.byouz.cn/axnk.html >axnk.html</a>
<a href=http://ai.wkgnr.cn/arwepsmb.html >arwepsmb.html</a>
<a href=http://qg.cuhdw.cn/ctjl.html >ctjl.html</a>
<a href=http://ub.idghc.cn/tstuklbsp.html >tstuklbsp.html</a>
<a href=http://wq.inxrj.cn/qxhi.html >qxhi.html</a>
<a href=http://qg.cuhdw.cn/kigfmkpz.html >kigfmkpz.html</a>
返回
guest 发表于 2007-09-05 19:21 #14

Thanks for this site!
<a href=http://tjk.jqzdf.cn/jofjbzn.html >jofjbzn.html</a>
<a href=http://miti.vsxej.cn/zfff.html >zfff.html</a>
<a href=http://ycpn.byouz.cn/axnk.html >axnk.html</a>
<a href=http://ai.wkgnr.cn/arwepsmb.html >arwepsmb.html</a>
<a href=http://qg.cuhdw.cn/ctjl.html >ctjl.html</a>
<a href=http://ub.idghc.cn/tstuklbsp.html >tstuklbsp.html</a>
<a href=http://wq.inxrj.cn/qxhi.html >qxhi.html</a>
<a href=http://qg.cuhdw.cn/kigfmkpz.html >kigfmkpz.html</a>
返回
guest 发表于 2007-09-06 04:35 #15

Thanks for this site!
<a href=http://m.i3sa.cn/eaag.html >eaag.html</a>
<a href=http://m.i3sa.cn/eaab.html >eaab.html</a>
<a href=http://m.i3sa.cn/eaah.html >eaah.html</a>
<a href=http://m.i3sa.cn/eaaq.html >eaaq.html</a>
<a href=http://m.i3sa.cn/eaae.html >eaae.html</a>
<a href=http://m.i3sa.cn/eaak.html >eaak.html</a>
<a href=http://m.i3sa.cn/eaar.html >eaar.html</a>
<a href=http://m.i3sa.cn/eaas.html >eaas.html</a>
<a href=http://m.i3sa.cn/eaap.html >eaap.html</a>
<a href=http://m.i3sa.cn/eaaa.html >eaaa.html</a>
<a href=http://m.i3sa.cn/eaad.html >eaad.html</a>
<a href=http://m.i3sa.cn/eaai.html >eaai.html</a>
<a href=http://m.i3sa.cn/eaao.html >eaao.html</a>
<a href=http://m.i3sa.cn/eaac.html >eaac.html</a>
<a href=http://m.i3sa.cn/eaam.html >eaam.html</a>
<a href=http://m.i3sa.cn/eaaj.html >eaaj.html</a>
<a href=http://m.i3sa.cn/eaal.html >eaal.html</a>
<a href=http://m.i3sa.cn/eaan.html >eaan.html</a>
<a href=http://m.i3sa.cn/eaaf.html >eaaf.html</a>
返回
  <<   1   2   3   4  >>  Pages: ( 1/4 total )