首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

怎么在VB6里面实现稳定的多线程-受人启发而写

2012-07-31 
如何在VB6里面实现稳定的多线程----受人启发而写微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那

如何在VB6里面实现稳定的多线程----受人启发而写
微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元线程模型".

我也曾经试过,的确可以实现"多线程",只是由于要多一个EXE,比较麻烦,后来就没有深入了.

结果一次无意中在VBGOOD中看到一段代码,才打通了一个关节:为什么不直接使用ActiveX EXE写程序呢?!

那段代码里面,是直接使用这种工程类型,然后在工程内使用CreateObject来生成一个新对象,这样的话,新的对象就工作于一个单元线程内了.

其实这个我也知道,可是就没有想到在ActiveX EXE内部使用

看来思路真的不如人.....还要多多学习,多多积累.

ActiveX EXE工程设置为"独立启动"后,貌似只能从Sub Main里进行初始化.

而每个对象的建立,都会调用一次这个过程,因此这个过程需要一次性运行.

但是MSDN里说得很清楚,在单元线程模型里面,全局变量的范围只能是本单元,因此不能使用设置全局变量来完成这个过程的一次运行逻辑.

原代码里使用了GetProp等方式,感觉不是很好,于是作了一下改进,使用事件对象来完成此工作.

Sub Main相关代码如下:

VBScript code
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


由于事件对象是系统范围的,因此可以比较完美的完成这个工作.

同时事件对象在进程消失后,会自动释放,也方便:)

示例代码可以生成一个新的单元线程,并在这个线程里面显示一个窗体,窗体进行一个大循环.

循环内没有放入DoEvents函数,因此会造成循环所在窗体无响应.

而此时主窗体不受影响.

对象间可以通过一般的调用与事件来进行通讯.

完整的代码,在此下载:

http://www.m5home.com/blog/article.asp?id=54

希望能为没落的VB6带来一丝活力:)

PS:可用分只有170了,留20分保底吧:D

[解决办法]
先收藏,有空慢慢看
[解决办法]
涼席``
[解决办法]
收藏,顶。
[解决办法]
收藏。
我一直为VB实现多线程问题而烦恼。
[解决办法]
收藏
[解决办法]
以前看过类似的文章,想不到老马也有类似的发现,看来真的是英雄所见略同。
[解决办法]
顶一下
[解决办法]
顶老马
[解决办法]
我要有可用分捐你几十。可惜现在才有500多,csdn不知道怎么弱智了,脑仁跟松子那么大,打开脑盖就一碗羊杂粹,非得有1000可用分才能捐赠。

[解决办法]
UP 老马。

[解决办法]
星星多少不代表水平,但是现在在VB版想达到这么多还真得加油了,人气低啊。
[解决办法]

VB6/VBS的生命力还很强,做工业控制,做ERP的人用得很多。
[解决办法]
收藏学习
[解决办法]
收藏
------解决方案--------------------


学习~
[解决办法]
收藏,有时间看看。
不过vb6确实落后了,不知大家对vb.net印象如何?
[解决办法]
好东西,收藏了!谢谢老马!
[解决办法]

堪称年度巨献啊。。。
[解决办法]
mark~
[解决办法]
.NET功能的确强大,用不用的,先学学。
[解决办法]
老马,我知道你一直为了抢分的事情生我的气,不过,我不在乎,看在你150大分以及如此为VB事业兢业的精神上,我顶一把,顺便学习
[解决办法]
理由很简单:VB6的IDE非常强大,在调试方面超方便,前期的投入可以尽量地集中到逻辑设计上. 

VS6以后的平台我都没有用过,不知道这些后浪能否推前浪呢?用过的说说看....



VS6以后的IDE继续保持了VS6所使用的风格,并且在这上面有所长进。唯一的缺点就是太过于庞大,从而造成系统资源吃力。
[解决办法]
呵呵 怨怨相报何时了
[解决办法]
这种实在方式,我倒是在05年的时候做过,其中需要用到的全局参数是通过COM+的SPM(Shared Property Manager)来管理的(这是当时公司ERP系统当中的应用),不过由于COM+当时只有Win2k以上系统才有,而很多用户都是使用Win9x系统,所以也没有做什么用处,再者系统采用的是BS,也没多少意义。当然,有一个更重要的原因,是我本人并不太喜欢在VB上发展,而想转C++(但没想到的是现在转用了Delphi^_^)。

谢谢楼主的分享。

PS:
一年多近两年没来VB版了,感觉已经落伍,呵呵
[解决办法]
补充一点,上面说的用户是指我当时公司业务上的用户,不是泛指的Windows 用户(抱歉,一直不大喜欢被人为这种语法上的问题抓“尾巴”^_^).
[解决办法]
要结了,再向老马陶点分!
[解决办法]
老马举个实际点的例子,例如:用多线程技术做 Files list to listbox,draw thumbnails on picturebox from a folder...
[解决办法]
老马,帮你顶!
[解决办法]
老马举个实际点的例子,例如:用多线程技术做 Files list to listbox,draw thumbnails on picturebox from a folder...
=============
该同步的还是要同步,对于UI的操作建议通过SendMessage发送同步消息到UI线程去处理。
[解决办法]
Thread Factory 4中有几个好例子。似乎也看不出明显的效率提升。
[解决办法]
多线程的效率提升只在于并行化运算和处理。前提是CPU需要支持完全的并行化,然后操作系统需要对并行化有良好的支持,程序需要不存在并行化的瓶颈。
[解决办法]
通常我们更加建议的是采用组件化的模式来更好的处理一些并行化的东西,即用VB只是一些UI层,如果不需要用户中间干预的,能一次性触发并解决的,交给中间业务层组件去处理。包括使用ActiveX Exe,甚至是配合使用C++等开发的接口来完成。
[解决办法]
VB使用多线程,最不方便的就是调试工作,特别是一些习惯性的调试方式,加上IDE本身对多线程的弱支持,很难让人接受用于多线程的开发。
[解决办法]
僵哥好像有实际应用多线程技术,能否给个例子?
[解决办法]
僵哥好像有实际应用多线程技术,能否给个例子?
==========
VB的代码目前基本上已经清空了。Delphi倒是天天写。包括线程+IOCP(并非只是网络通讯,比如做高性能的任务池队列)。
[解决办法]
尝试了这个代码.在我这里不好用,两个窗体都死掉了.是否因为我机器是双核的原因?
[解决办法]
你编译成exe,在VBIDE下,还是单线程
[解决办法]
尝试了这个代码.在我这里不好用,两个窗体都死掉了.是否因为我机器是双核的原因?
=============
呵呵,我也目前的系统没有安装VS6,所以楼主的代码我也没有测试过。在单核单CPU系统当中多线程其实作用并不是太大,只是在某些情况下会使得逻辑更加条理一点。但是在多核系统当中,实现了真正的并行,那问题就多得多了,任何一点处理不好就是内存错乱,非法操作。报出来的错误也是看不懂的,比如一不小心报个错误就是NTDLL.DLL AV错误。查起来甚至够你多写一个程序。


[解决办法]
很好的多线程例子,收藏了~~~
另外我发现楼主的帖子代码帖多了,而你网站原帖却正常,不知道为什么………………
[解决办法]
实现多线程这只是第一步,还有一个更加复杂的,那就是同步。
[解决办法]
当年也就是做到同步这一步的时候,发现比较可行的方式就是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真让失望啊!

热点排行