分享
 
 
 

ActiveX .Exe .Dll Server的多线程

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

ActiveX .Exe .Dll Server的多线程(执行绪=线程)

来源:cww / AKL

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译为执行绪)

物件类别的六种Instancing

Private

只有元件内部可以使用,对外为不可见。

PublicNotCreatable

Client端可引用(可见),但不可建立,可用於元件的CallBack行为。

SingleUse

Client端所要求建立之每一个同类别的物件实体都具有自己的元件执行个体。

GlobalSingleUse

多了Global表示元件编译後便成为全域物件,使用时无需先行引用。

MultiUse

Client端所要求建立之每一个同类别的物件实体都使用同一个元件执行个体。

GlobalMultiUse

多了Global表示元件编译後便成为全域物件,使用时无需先行引用。

ActiveX EXE

以MultiUse物件别类测试所得之元件Process与Thread关系

VB中文版选项译名

我自己的解释

Client物件数

Process数

每个Process的Thread数

独立的执行绪

独立的Thread

N

1

N+1

执行绪共用区1个执行绪

单一的Thread

N

1

1

执行绪共用区M个执行绪

共用M个Thread

N

1

N+1(N+1≤M)

以SingleUse物件别类测试所得之元件Process与Thread关系

VB中文版选项译名

我自己的解释

Client物件数

Process数

每个Process的Thread数

独立的执行绪

独立的Thread

N

N

1

执行绪共用区1个执行绪

单一的Thread

N

N

1

执行绪共用区M个执行绪

共用M个Thread

N

N

1

注:此测试中的Client端均为单一Process。

执行绪模型 (独立/共用n个行程)

类别Instancing (SingleUse/MultiUse)

意义

元件执行个体是否为多Thread。独立执行绪的元件执行个体为每一个物件实体与其自身建立一个Thread,所以一共是(物件数目+1)个Thread。

元件执行个体中的一个物件实体在执行一项工作时,必需由元件执行个体所拥有一个Thread负责供提CPU的使用权。元件若可以拥有多个Thread,表示可以让多个物件实体同时工作而不需等待占据Thread的物件释放Thread。若把元件的执行绪模型设为共用一个以上的执行绪,即等於公寓模型。

Single和Multi指的是Client端所建立的物件实体如何存在於元件执行个体(即元件的Process)中,也就是元件的执行个体中是否能存在一个以上相同类别的物件(SingleUse不行,MultiUse可以)。若该元件中提供了不只一个物件类别,则会在SingleUse类别的物件不重复的情况下共用同一个元件执行个体。一旦SingleUse类别的物件被呼叫端建立超过一个以上,则将自动产生另一个元件的执行个体(Process),并在新的元件执行个体中产生呼叫端所要求建立的SingleUse类别之物件。

影响

同一元件执行个体(Process)中不同的物件是否能一起运作。

由於物件存在的空间不同(Process不同),SingleUse物件无法与同类别物件之间共用全域资料。只有MultiUse的物件可以共用全域资料,且享有单一Process,多重Thread的好处。

不论是ActiveX DLL或ActiveX EXE,能否共用一般模组中Public变数的关键即在於物件实体是否存在於相同的元件执行个体(Process)中。由於ActiveX DLL是属於In-Process的元件,故而其中之物件类别模组没有SingleUse的Instancing,以其提供之类别来产生的物件实体是存在於Client端的Process中,若多个物件同时存在於Client端的同一Process中,则可共用一般模组中Public变数。以Out-Process的ActiveX EXE而言,若Client端所建立的物件为SingleUse,则不论把元件专案的执行绪模型设成什麽,都一律为每一个物件产生新的元件执行个体(Process);若物件类别为MultiUse,而元件专案的执行绪模型为独立的执行绪,则会在同一个元件执行个体(Process)中建立多个Thread以对应每一个Client端所建立的物件实体。

结论:物件类别的SingleUse / MultiUse所影响的是元件是否为MultiProcess;元件执行绪模型的「独立或共用N个 / 共用1个」所影响的是元件是否为MultiThread。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有