资源描述:
《用VB创建高效的多线程应用程序.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用VB创建高效的多线程应用程序Ma::卜eweur.and镊撰文/编译/卜平visualBasicSTA关键词多线程,。vB本已经croft的官方文献并未明确指出这一点国内介绍身的机制提供了对创建多线程应用程序的内在支持尽管Mios,。创建vB多线程应用程序的文章大多采用A尸l函数份ea七e丁hread但是实际上这种方法并不可取本文将向读者展示如何挖掘vB,,,对S丁A的支持以构造多线程的应用程序如何防止线程间的相互阻塞以执行异步方法调用如何在线程间有效地通讯以及。如何重载S丁A内建的方法顺序Vis以alBasie6(以及安装了SPZ或SP3的VB
2、S)为创建COn一。,VB多线程应用程序提供了内置的支持更明确地说支持在tr乙{ler默探靛⋯嘿戏瑞省氢COrl、,单个进程的多个线程中运行单线程单元(STA)在一个STA_-中;运行的任何代码的当前线程总是创建该单元的线程它不{咒群橇俞碗碗一同干多线程单元(M,。SubMainController,ControllerTA)MTA允许代码运行在任何线程中首先在中新建一个在一.STAClass_Initial主zefrrnMainSetfrmMain从另一个线程中调用一个要求你在请求线程中建立的中显示并且执行,。。一个代理(proxyTAstubC
3、ontroller=Meorker一)并在被调用的S中建立一个桩()新建一个线程仅仅是对W类调用,Createobeet。VBCreateobjeet代理对象跨越进程边界将调用列集到桩然后由桩调用实际次j这么简单把调用看成是一,代码。桩与被调用的STA在同一个线程中,因此该被调用的个新建Worker实例的外部请求故而自动新建了一个。STA无STANew来创建同一个工程中的Worker法区分一个调用是来自线程内还是列集自另一个线如果你使用实程。桩还提供了内置的顺序,从而保证调用按照接收的顺序例,VB将在同一线程内创建它。执行,只有前一个调用完成了后一
4、个调用才允许开始执行。VB对STA模型的实现不支持真正的全局变量,这意味VB为其线程模型使用STA,因此几乎所有困扰自由线程的着你无法通过设置全局标志来阻止当创建工作线程时调用u,M。SbMain导致的主Ul重复执行你也无法从App或其他任TA代码的同步动作在STA模型中将被自动处理VB对,API我将在这篇文章中为您展示如何挖掘VB对5TA的支持以何象中获得该信息因此你必须使用调用来确定。,SubMain是否在进程中首次被调用随VB一起发布的示例构造多线程的应用程序如何阻止线程间的相互阻塞以执行异步o方法,如何在线程间有效的通讯,5TA代码使用一个
5、隐藏的窗体并通过API函数Findwindw来检调用以及如何重载内建,。adCheck的方法顺序我将集中介绍如何在ActiveXEXE项目中使用这些测不过我发现用一个叫Thre的类在本地原子表中,。;如果你想在,。l技术DLL或0CX中创建新线程步骤将大不相同设置一个标志量要更简单也更直观(见表)创建多线程应用程序的快速指南需要额外的线程吗?创建多线程应用程序需要执行一些步骤,使用这些简单Privatem_ThreadCheek人5NewThreadCheek:Prlva七em_fFareationAsBoolean的方法开始土ICu打井一公个扬户
6、勺火幸咖碑琴E火日项歇SubMa上n()、Dime七1AsController2.打开项目属性对话框.1fm_ThreadCheckF工rstThen.I上APPgtartMode二vbSModestandaloneThenSetetl二NewContrOI工er燕薰淤嚣辣盛蕊⋯EISem_fFa立ICre己tlon=TrueEndIfEISeSetm_宁hreadCheck二NothinqEndIf{麟)价洋布EndSub码)。在工程中包含提供的这两个文件以使用该技术模拟异,ultiU阴对elassll飞jtiali之e在所有M象的中调用·:,。
7、,不要t戈图跟岭轰错误在Mai”中抛出错误会引起崩溃但是在步方法调用,c翼las攀民一In)jL嚣ia工ize黔中可以羔抛滋翼。儡出错误给客户⋯Publ主己SuVer生fyCrea七1生巾t)工lementsFlre乎lme刃Publ主己SubVefyC巾戈)}叩工1fm_fPa主工Cred仁工主onThenl..,,’‘”E厂rRaise吐29,,’‘NotforPpubliececons飞止mptjon”Pri7a匕e汀T」merIDAs乙01王gotfli队阴ptjo,匕EndIf.卜__eSub00七。ngTask_扁日ndSL几b___
8、_____一--护ub工i丈翌上竺__一一—保存参数井激活定时器,__。表1r。。d。。欠类可以检测一个给定的线程是不是工