ActiveX .Exe .Dll Server的多线程
2004-12-16 10:15
239 查看
ActiveX .Exe .Dll Server的多线程 来源:cww / AKL Yuqun 翻译成简体 ActiveX .exe .dll Server都可以设定成多线程,但手册上面得大多有看没有 懂,尤其是Project本身可设定多线程,而Class又可设定成MultiUSe,搞得不是 很清楚,在经过一些testing後,整理出一些东西,以补足手册上的不清楚,看完它 再去看手册的说明就会比较清楚啦(我想)。如果我的观念有误,也请更正。 MyProject 假设有一个ActiveX Server,其内有一个Class和.bas Module组成 | +- Class | | | +--- MyClass | Public cp as long | Private cv as Long | Public Sub cFunc1() | . | . | End Function | Public Sub cFunc2() | . | . | End Sub | +- Module | +--- MyBas.Bas Public basVar as long Public Sub Sub1() . . End Sub 一、Myproject为ActiveX .exe Server 1.MyProject设定成单一线程 a.Myclass 为MultiUse 表示该Class的每一个Instance都是固定由某一个Thread来执行, 所谓MultiUse便是单一个线程可对多个Instance提供服务 client A 的程序 client B 的程序 dim aa as New MyClass dim bb as New Myclass Call aa.cFunc1 Call bb.cFunc2 如上例,ClientA ClientB同时对某一部电脑上的MyProject提出需求, 此时,第一个呼叫它的程序(假设是Call aa.cFunc1)将该Server叫起来了, 如果此时ClientB也对之提出要求,那麽的ClinetA aa这个instance和 Client B的bb Instance共用同一个Thread,也就是说这两个Instance必 需进入排程,共用一个Thread的情况又有什麽特性呢?此时aa, bb共用 MyBas.Bas内的资料,如上例中的basVar会共用,不论是改了它都会影响 另一个人,但是bb, aa这两个Class Instance有自己的变量,即aa 有自己 cp, cv的变量,bb也有自己的,这就是所谓的公寓模式,在.clx内的东西 各人有各人的,但共用.bas的资料。以这个例子来说,如果aa.cFunc1已在 执行,而且它是一个Long Job,而 bb.cFunc2也要来执行时,它便得进入 Queue中等待,所以会有交通阻塞的情况。 b.SingleUse 表示某个Class的instance 只在一个Thread上执行,同样以上面的例子来看 aa 这个Instance产生了,那它在Thread1 上执行,而同时bb也产生了,那 它会在另一个Thread2上执行,而Thread1, Thread2本身有自己的区域资料 ,所以aa, bb就不会用MyBas.Bas内的任何资料,正因aa, bb在不同的thread 上执行,所以它们两个便以排程的方式来执行,不会有谁先做,另一个人一定 得等,aa的thread先做,做了一段时间後会Swap变bb的Thread做,所以有可能 bb.cFunc2先完成。但缺点是浪费Resource。不要被MyProject的单一线程给 骗了,它是设成单一线程,但Class设成SingleUse时,仍有可能是 MultiThread的Server 另一个例子: Myproject中有二个Class,Class1为MultiUse, Class2为SingleUse 且有一个MyBas.Bas Module Dim aa as New Class1 Dim bb as New Class1 Dim aa2 as New Class2 Dim bb2 as New Class2 aa.method1 aa2.method2 bb.func1 bb2,func2 则aa, aa2, bb 共用mybas.bas之资料,bb2没有共用,aa, bb同一个thread 没有问题,aa2呢?那是因为SingleUse对象是Class,方才的thread虽有aa, bb 於其上,但那是Class1, Class2尚未有Instance於thread上,故选择方才的 thread来执行,而bb2自然得在另一个Thread上啦。这个前提是只有一个Client 来执行,如果有两个以上Client时,我们不知执行的前後顺序,所以不易预测 谁和谁共用资料。而我们可透过App.ThreadId来取得Thread的id,以上例来说 如果於Class1, Class2中各有引用App.ThreadId时,会发现aa, aa2, bb所取得 的是相同的,而bb2所取得者不相同。 2.MyProject设成多线程 假设我们设定MyProject有4个Thread (T1 to T4) T1 | | T4 ---+---- T2 | | T3 如果有Client1 to 3 呼叫Server的顺序如下 ClassA (multiUse) client1 要求 ClassA -->A1 则於 T1执行 ClassB (MultiUse) client2 要求 ClassA -->A2 .. T2 .. ClassC (multiUse) client1 .. ClassB -->B1 .. T3 .. Mybas.bas client3 .. ClassC -->C3 .. T4 .. client2 .. ClassC -->C2 .. T1 .. client1 .. ClassC -->C1 .. T2 .. 也就是说,Client 端每产生一个Instance,该Instance便会一在下一个Thread上 执行,如此的循环,所以这个例子来看,变成A1, C2共用mybas.bas的资料,A2, C1 是另一组共用者。如此造成谁和共用资料十分不明确,不过定的是每个.clx都有自己 的资料,符合公寓式模型。 另外,如果Instance A1(Client1所产生的ClassA Instance)於T1中执行,而A1中 去Create Instance B时,If使用New指令则Instance B也在T1中执行,故和A1共用 Mybas.Bas但,使用CreateObject则Instabce B会在T2中执行。 至於三个Class中有一个是SingleUse时会如何,本人已没有再测下去,可以知道的是 SingleUse的Class会找一个没有执行同一Class的Thread来执行,但如果4个Thread 都有时,会不会产生第五个Thread来做,可能吧,没有力testing了。 3.MyProject设成独立线程 同多线程,只是没有限制thread个数。 二、MyProject 是ActiveX. Dll Server 因是.Dll 的方式存在,所以Class不可能是SingleUse,因为一个Process 一不能有相同的两份.dll 1.MyProject设单一线程 客户端多线程.exe 有Thread 1 -3 thread1, thread2, thread3同时要求该class时,则後到的要等待 前面的处理完才能做,因该Server只有单一线程。各个Instance 共用.Bas内的资料。 2.MyProject设成公寓模型(多线程) 同上的状况来说,Thread1- 3 对该Class的运作,就没有谁等谁的情况。 因为 多线程.exe的各个Thread,都定义了Dll Server中的一问公寓 ,所有在线程中所建之的对象都住在该线程定义的公寓中,除非Thread3 使用Thread2的对象方法,那这呼叫会被排在Thread2本身目前正在处理的 对象之後(循序化)。 以下是AKL的整理 先就此主题所涉及之专有名词做强调: 元件:指提供一个或数个对象类别的ActiveX Server(或者说OLE Server)。 进程:Process,程序的定址空间,程序的资料与程序本身都储存在此一定址空间内,可视为程序活动的空间,是对象存在的地方,一个ActiveX Server(此指EXE)的执行个体具有一个Process。 线程:Thread,为占据一个OS分时作业的单位,程序的执行需要有Thread,一个程序的Process中若有多个Thread,可以同时进行多项工作,且占用整个OS的分时单位比较多。 注:MSDN的中译把Process译为进程,而Thread译为线程┅ (国内讲C或C++比较有品的书都把Process译为进程,而Thread译为线程)
结论:对象类别的SingleUse / MultiUse所影响的是元件是否为MultiProcess;元件线程模型的「独立或共用N个 / 共用1个」所影响的是元件是否为MultiThread。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
相关文章推荐
- ActiveX .Exe .Dll Server的多執行緒(转)
- 关于VB使用ActiveX.Exe创建多线程程序的奇怪问题
- VC6.0向导没有MFC ActiveX Controlwizard,MFC AppWizard (dll),MFC AppWizard (exe) VC6.0致命错误 RC1015: 无法打开包含文
- 解决 ActiveX 0x7730DCBB (ntdll.dll) (iexplore.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x77344268)。
- ActiveX EXE与ActiveX DLL的区别
- win8.1 下activex编程遇到的问题之 “控件已加载 但对DllRegisterServer的调用失败”
- 浏览器访问串口与vb6 ActiveX dll ActiveX Exe Active Ocx 的区别
- 病毒报告:Proxyserver.dll zkeyHook.dll winplaybdbcom.exe winplayfuwu winplaybdcom
- ActiveX控件,ActiveX DLL,ActiveX EXE之间的差别~~
- VS2015 VC 生成exe,dll一直卡着不结束
- 用Python生成不依赖dll的exe的操作步骤简介
- dll与exe的区别
- VS2010设置目标文件(.dll/.exe)和导入库文件(.lib)的输出路径
- dnSpy进行反编译修改并编译运行EXE或DLL
- windows在**.exe中触发了一个断点,其原因可能是堆被损坏,这说明。。。dll中有bug
- vs2013+qt生成的exe无法找到入口,无法定位程序输入点与动态库*.exe,而不是DLL
- 新手易步入的Qt中QTcpServer多线程误区
- 一个从EXE、DLL文件中提取、存取图标完整程序
- DLL.LIB.EXE.TLB
- VS2005 Debug版,dll /MTd,exe /MDd的潜在bug