读书人

用ACTIVEX EXE 实现多线程时怎么解决

发布时间: 2012-03-19 22:03:05 作者: rapoo

用ACTIVEX EXE 实现多线程时,如何解决WithEvents不能定义数组的问题
这几天用ACTIVEX EXE准备做多线程程序,ACTIVEX EXE是写完了,可是在写主程序里发现使用 WithEvents,可以声明任意个所需的单变量,但不能使用 WithEvents 创建数组。问题是我要用200个线程,不可能在程序里定义200个变量再写200套事件的处理吧吧?
在ACTIVEX EXE中处理事件,不用WithEvents还有其它办法吗?
哪位大哥给个解决的方法啊,不然这几天的没日没夜白干了

是不是要把生成的ACTIVEX EXE再放在一个ACTIVEX控件里做控件数组?不会吧!

(还有,请不要在回贴里争论ACTIVEX EXE实现的是不是真多线程的问题,已经力心交悴了,只要知道解决方法)

先谢谢大家了!!!


[解决办法]
可以借用一个类来实现,在类里面withevent你的ActiveXEXE,然后在其它模块里面定义类数组。
用ADODB.Recordset来举例:
类Class1:
Public WithEvents x As ADODB.Recordset
‘然后下面写X的各种事件代码
..........

窗体:
Dim a(100) As New ADODB.Recordset
Dim b(100) As New Class1

Private Sub Form_Load()
Dim i As Long
For i = 0 To 100
Set b(i).x = a(i)
Next
End Sub

[解决办法]
目前正面临着相同的问题。VB不支持ActiveX Dll或exe数组中的事件,的确造成了很多不便。将Active Exe打包到控件中到是一种思路,只是不知道是否还会有多线程?帮顶,看高手们如何回答。
[解决办法]
yachong(蚜虫) 的方法可行,还有另外一种方法。如果Active EXE是你自己写的,可以不用事件,用接口。
如:Active EXE 中有一个类期望以事件的形式通知接受者,可以声明一个事件接口,在接收者中来实现这个接口即可。

业务类 cCoffee,需要提供一个事件通知 onCoffeeReady
Event onCoffeeReady() ' 这是事件的方式
如果用接口,那需要再增加一个类 IEventHandler

'IEventHandler
public sub onCoffeeReady()

end sub

然后再cCoffee类中加入接收者
public Handler as new IEventHandler

public sub test()
raiseevent onCoffeeReady() ' 这是事件的方式
Handler.onCoffeeReady() ' 使用接口
end sub

在接收者中需要做如下处理,以下代码在 Form 中

implements IEventHandler

private mCoffee as cCoffee

private sub Form_Load()
set mCoffee = new cCoffee
set mCoffee.Handler = me
end sub

private sub Command1_Click()
mCoffee.Test
end sub

private sub IEventHandler_onCoffeeReady()
' do sth... ' 处理通知
end sub

跟事件相比接口有两个地方不好处理,一是广播,事件可以有多个接收者,不过这个可以变通解决。二是接收者中的运行错误不会影响到事件源。
[解决办法]
yachong(蚜虫) 说的我不太明白,可能是我太笨了,汗!
fj182(阿花)的方法很不错呀!
[解决办法]
汗...没办法...

为了实现生成的数组对象也有事件,只能使用控件再封装一次了....

我也只发现这个办法..

麻烦是麻烦了点,不过使用上却是很方便

如果控件整成轻量控件,占资源也蛮少的

以前我写的一个邮件群发软件就是这样做滴....(HOHO)
[解决办法]
蚜虫和老马说的是一个道理,只是一个用类一个用控件。结果是一样的。
陪你俩汗...

读书人网 >VB

热点推荐