如何在VB6里面实现稳定的多线程----受人启发而写
微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元线程模型".
我也曾经试过,的确可以实现"多线程",只是由于要多一个EXE,比较麻烦,后来就没有深入了.
结果一次无意中在VBGOOD中看到一段代码,才打通了一个关节:为什么不直接使用ActiveX EXE写程序呢?!
那段代码里面,是直接使用这种工程类型,然后在工程内使用CreateObject来生成一个新对象,这样的话,新的对象就工作于一个单元线程内了.
其实这个我也知道,可是就没有想到在ActiveX EXE内部使用
看来思路真的不如人.....还要多多学习,多多积累.
ActiveX EXE工程设置为"独立启动"后,貌似只能从Sub Main里进行初始化.
而每个对象的建立,都会调用一次这个过程,因此这个过程需要一次性运行.
但是MSDN里说得很清楚,在单元线程模型里面,全局变量的范围只能是本单元,因此不能使用设置全局变量来完成这个过程的一次运行逻辑.
原代码里使用了GetProp等方式,感觉不是很好,于是作了一下改进,使用事件对象来完成此工作.
Sub Main相关代码如下:
Private Const MyEvent As String = "m5home" Dim hEvent As Long Sub Main() If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断. hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了. frmMain.Show End If End Sub Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent) Call CloseHandle(GetEventHandle) End Function Public Function Quit() Call CloseHandle(hEvent) End Function Private Const MyEvent As String = "m5home"Dim hEvent As LongSub Main() If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断. hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了. frmMain.Show End IfEnd SubPrivate Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent) Call CloseHandle(GetEventHandle)End FunctionPublic Function Quit() Call CloseHandle(hEvent)End Function
[解决办法]
很好的多线程例子,收藏了~~~
另外我发现楼主的帖子代码帖多了,而你网站原帖却正常,不知道为什么………………
[解决办法]
实现多线程这只是第一步,还有一个更加复杂的,那就是同步。
[解决办法]
当年也就是做到同步这一步的时候,发现比较可行的方式就是ActiveX,只有ActiveX才有消息循环处理,而同步过程必须是单例的,那么多线程组件就不应该跟它绑在一起,而需要把同步控件写为一个container,而线程必须依赖于Container。但是线程只能是组件,这个处理起来就相对比较麻烦。
如此一步一步问题的复杂化,加上时间上的不足,之后工作的更换,也就没有再继续。
[解决办法]
看看MultiThread的实际应用 using ActiveX exe:
Feb.29,2008
MultiThread Search Engine Reporter
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=70174&lngWId=1
stable and fast!
[解决办法]
收藏~~~
[解决办法]
现在这个例子里面,另一个线程的对象与UI通讯的方式是事件触发,感觉还是不好,会影响UI的.
比如,把那个大循环窗体的进度事件显示在UI窗体上,那UI窗体就有些不对头了.....
估计还是得用消息投递的方式通讯,这样才不会有问题.
===================
VB里面的事件触发应该对应的是COM当中的连接点,有点类似于回调,实际上这个时候并不影响到UI线程(这里假定就是所谓的“主”线程)的操作。除非有去操作UI线程当中的UI对象。有一个习惯是,通常操作UI对象是通过修改属性的方式去处理的,而对于部分语言开发的UI控件,更多的时候,不是直接通过发送消息->响应消息来处理属性的变更,而是直接使用调用属性变更方法的线程直接对内部的一些数据进行修改,从而可能会与其它线程的并行操作相冲突。比较好的办法就是发送消息。而我前面贴子当中所说的也就是指的避开此类问题的发送,通常附加一个运行于UI线程当中的消息循环来接收一个“同步”消息,然后就被切换到主线程当中执行,从而实现了所有相应操作在主线程当中的串行化。
[解决办法]
收藏,哈,
这就是传说中的 马胸 ??
[解决办法]
拼命顶了!!
[解决办法]
谢谢楼主了,收藏好好研究一下,正需要这方面的资料呢。以前做过但很不稳定,希望能够改观。
[解决办法]
mark
[解决办法]
mark
[解决办法]
mark,look
[解决办法]
近来VB版难得的技术热贴,顶了
[解决办法]
来晚了,我千里迢迢来踢老马的。
[解决办法]
最近CSDN为什么这么慢?特别是贴子刷新,估计跟线程有关...,哈哈,开个玩笑罢了!
[解决办法]
[解决办法]
呵呵,三更半夜,正好用力顶一下...
[解决办法]
多线程用API来实现,一编绎成EXE,运行就死
VB真让失望啊!