怎样在VBc 中实现多线程程

2009年4月 VB大版内专家分月排行榜第三2007年10月 VB大版内专家分月排行榜第三
2016年11月 VB大版内专家分月排行榜第二2016年1月 MS-SQL Server大版内专家分月排行榜第二2015年12月 MS-SQL Server大版内专家分月排行榜第二2015年11月 MS-SQL Server大版内专家分月排行榜第二2015年5月 MS-SQL Server大版内专家分月排行榜第二2015年4月 MS-SQL Server大版内专家分月排行榜第二2015年1月 VB大版内专家分月排行榜第二2015年1月 MS-SQL Server大版内专家分月排行榜第二2014年12月 VB大版内专家分月排行榜第二2014年11月 MS-SQL Server大版内专家分月排行榜第二2014年9月 MS-SQL Server大版内专家分月排行榜第二2013年8月 VB大版内专家分月排行榜第二2013年6月 VB大版内专家分月排行榜第二2013年5月 VB大版内专家分月排行榜第二2010年4月 VB大版内专家分月排行榜第二2010年3月 VB大版内专家分月排行榜第二2008年12月 VB大版内专家分月排行榜第二2008年8月 VB大版内专家分月排行榜第二2008年7月 VB大版内专家分月排行榜第二2007年11月 VB大版内专家分月排行榜第二
2017年1月 MS-SQL Server大版内专家分月排行榜第三2015年6月 MS-SQL Server大版内专家分月排行榜第三2015年3月 MS-SQL Server大版内专家分月排行榜第三2015年2月 MS-SQL Server大版内专家分月排行榜第三2014年12月 MS-SQL Server大版内专家分月排行榜第三2014年10月 VB大版内专家分月排行榜第三2014年10月 MS-SQL Server大版内专家分月排行榜第三2014年8月 MS-SQL Server大版内专家分月排行榜第三2013年9月 VB大版内专家分月排行榜第三2013年3月 VB大版内专家分月排行榜第三2012年5月 VB大版内专家分月排行榜第三2012年4月 VB大版内专家分月排行榜第三2010年10月 VB大版内专家分月排行榜第三2010年8月 VB大版内专家分月排行榜第三2010年7月 VB大版内专家分月排行榜第三2009年5月 VB大版内专家分月排行榜第三2008年9月 VB大版内专家分月排行榜第三2008年4月 VB大版内专家分月排行榜第三2008年2月 VB大版内专家分月排行榜第三
2007年9月 VB大版内专家分月排行榜第二
2008年3月 VB大版内专家分月排行榜第三2007年8月 VB大版内专家分月排行榜第三
2016年11月 VB大版内专家分月排行榜第二2016年1月 MS-SQL Server大版内专家分月排行榜第二2015年12月 MS-SQL Server大版内专家分月排行榜第二2015年11月 MS-SQL Server大版内专家分月排行榜第二2015年5月 MS-SQL Server大版内专家分月排行榜第二2015年4月 MS-SQL Server大版内专家分月排行榜第二2015年1月 VB大版内专家分月排行榜第二2015年1月 MS-SQL Server大版内专家分月排行榜第二2014年12月 VB大版内专家分月排行榜第二2014年11月 MS-SQL Server大版内专家分月排行榜第二2014年9月 MS-SQL Server大版内专家分月排行榜第二2013年8月 VB大版内专家分月排行榜第二2013年6月 VB大版内专家分月排行榜第二2013年5月 VB大版内专家分月排行榜第二2010年4月 VB大版内专家分月排行榜第二2010年3月 VB大版内专家分月排行榜第二2008年12月 VB大版内专家分月排行榜第二2008年8月 VB大版内专家分月排行榜第二2008年7月 VB大版内专家分月排行榜第二2007年11月 VB大版内专家分月排行榜第二
2017年1月 MS-SQL Server大版内专家分月排行榜第三2015年6月 MS-SQL Server大版内专家分月排行榜第三2015年3月 MS-SQL Server大版内专家分月排行榜第三2015年2月 MS-SQL Server大版内专家分月排行榜第三2014年12月 MS-SQL Server大版内专家分月排行榜第三2014年10月 VB大版内专家分月排行榜第三2014年10月 MS-SQL Server大版内专家分月排行榜第三2014年8月 MS-SQL Server大版内专家分月排行榜第三2013年9月 VB大版内专家分月排行榜第三2013年3月 VB大版内专家分月排行榜第三2012年5月 VB大版内专家分月排行榜第三2012年4月 VB大版内专家分月排行榜第三2010年10月 VB大版内专家分月排行榜第三2010年8月 VB大版内专家分月排行榜第三2010年7月 VB大版内专家分月排行榜第三2009年5月 VB大版内专家分月排行榜第三2008年9月 VB大版内专家分月排行榜第三2008年4月 VB大版内专家分月排行榜第三2008年2月 VB大版内专家分月排行榜第三
2007年9月 VB大版内专家分月排行榜第二
2008年3月 VB大版内专家分月排行榜第三2007年8月 VB大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。如何在VB6里面实现稳定的多线程
作者:admin 日期:
微软官方给出的方案在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 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函数,因此会造成循环所在窗体无响应.而此时主窗体不受影响.对象间可以通过一般的调用与事件来进行通讯.完整的代码,在此下载: **************************改一下,添加一个简单测试例子***********************
评论: 24 | 引用: 0 | 查看次数: 9271
如果是这样的话,可以参考这个代码:将会挂起的操作放在一个类里,并添加一个事件,用于操作完成后触发调用者.再用CreateObject创建对象,则它就在另一线程中了.主线程调用后就返回,然后等待操作完成的事件.
这个功能不需要什么特殊的地方吧.信息的记录与FTP上传,没有冲突啊!你可以设置为定时+定量上传,比如30分钟内如果有新内容就上传,以及如果新内容超过500K就上传.
没有明白你的意思.....
除非你是调用了另一线程中的过程,而这个过程是耗时的,未处理完前不返回,那样的话肯定会挂起啊.这种情况比较方便的是使用一个定时器,在调用过程中存储参数,并启动定时器,让过程立即返回.然后定时器触发后再调用真正的处理过程.......
如果仅仅是这个功能,那好象没有必要使用多线程吧.
这没办法,MDI窗体好象有个什么数据共享还是什么之类的问题,比较麻烦,所以微软干脆禁止了MDI窗体在多线程工程中的使用.....
大量使用时的开销的确很大,特别是在线程间调度的操作比较多的时候.我一般是用于UI分离,达到不挂起UI的效果即可......
为什么在线程里不能实现winsock.accept 测试了下,建立不了连接WINSOCK内部貌似是多线程实现的你只要保证你的数据处理过程不会卡死就不需要多线程处理.至于这个连接问题,有可能是你代码的问题,我的第二个例子就是使用WINSOCK做下载的示例,没有发现你所说的问题.
msgbox会卡死二边应该做到只卡一面自己做一个MSGBOX窗体?编译后应该是只卡当前线程的
请问我要加载N个线程应该怎么做?建立多个对象即可把对象生成一个数组,使用CreateObject来初始化.
什么破过滤没办法,机器人太多了.添加了不少广告方面的过滤.我可不想我的BLOG变成广告页.
2012年1月日一二三四五六用VB6实现真正实用的多线程处理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用VB6实现真正实用的多线程处理
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢VB 多线程实例代码
我的图书馆
VB 多线程实例代码
最近因为想写一个多线程的工具,以前也没写过;所以查了些VB多线程资料;方法虽然有很多,但我觉得这种是最简单而且又安全的一种真真的VB多线程方法。
大家往下看吧,分2大步骤;
1、新建一个工程,类型选择ActiveX Exe,工程重命名为TestExe在工程中添加一个Form,放上一个Timer控件。注:Timer&控件&interval值别忘了设置。将Class1改名为clsTest,注意其Instancing要设置为5-MultiUse。
以下是clsTest类模块其代码:
Option ExplicitPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private WithEvents oTimer As TimerPrivate frmTmp As Form1Private lTotalLoop As LongPrivate bDoStop As BooleanPrivate lInterval As Long
Public Event Progress(ByVal lProgress As Long)
Public Sub StartSub(ByVal lTotal As Long)&&& lTotalLoop = lTotal&&& oTimer.Enabled = TrueEnd Sub
Public Sub StopSub()&&& bDoStop = TrueEnd Sub
Private Sub Class_Initialize()&&& Set frmTmp = New Form1&&& Load frmTmp&&& Set oTimer = frmTmp.Timer1&&& oTimer.Enabled = False&&& bDoStop = False&&& lInterval = 1End Sub
Private Sub DoLoop()&&& Dim i As Long&&& For i = 0 To lTotalLoop&&&&&&& Sleep (lInterval)&&&&&&& RaiseEvent Progress(i)&&&&&&& &&&&&&& If bDoStop = True Then&&&&&&&&&&& Exit Sub&&&&&&& End If&&&&&&& &&& NextEnd Sub
Private Sub Class_Terminate()&&& Unload frmTmp&&& Set frmTmp = Nothing&&& Set oTimer = NothingEnd Sub
Private Sub oTimer_Timer()&&& oTimer.Enabled = False&&& DoLoopEnd Sub
Public Property Get lMillisecs() As Long&&& lMillisecs = lIntervalEnd Property
Public Property Let lMillisecs(ByVal vNewValue As Long)&&& lInterval = vNewValueEnd Property
在TestExe 工程属性的通用页下,选择线程缓冲沲,线程数值设值为2。 则调用此ActiveX Exe最多能同时有两个线程, 更多的请求将放置于队列中。编译生成TestExe2、下面来测试我们的多线程程序:
新建一个标准 Exe工程,在“引用”中选择刚刚编译生成的TestExe.exe在Form1中添加两个ListBox,两个CommandButton,Command1为开始,Command2为停止以下是Project1.Form1的代码:
Option ExplicitPrivate WithEvents oTest1 As TestEXE.clsTestPrivate WithEvents oTest2 As TestEXE.clsTest
Private Sub Command1_Click()&&& Set oTest1 = New TestEXE.clsTest&&& oTest1.lMillisecs = 100&&& oTest1.StartSub (1000)&&& &&& Set oTest2 = New TestEXE.clsTest&&& oTest2.lMillisecs = 100&&& oTest2.StartSub (1000)End Sub
Private Sub Command2_Click()&&& oTest1.StopSub&&& oTest2.StopSubEnd Sub
Private Sub Form_Unload(Cancel As Integer)&&& Set oTest1 = Nothing&&& Set oTest2 = NothingEnd Sub
Private Sub oTest1_Progress(ByVal lProgress As Long)&&& List1.AddItem lProgress&&& List1.ListIndex = List1.ListCount - 1End Sub
Private Sub oTest2_Progress(ByVal lProgress As Long)&&& List2.AddItem lProgress&&& List2.ListIndex = List2.ListCount - 1End Sub
大功告成,启动运行form1,点击Command1,怎么样,看见来效果了吗?
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 怎样实现多线程 的文章

 

随机推荐