到http://www.planet-source-code.com/vb/
以Thread为关键字搜索,有很多这方面的代码
以Thread为关键字搜索,有很多这方面的代码
解决方案 »
- 请教下面代码(为什么图片闪得很厉害)
- 为什么,我配置的ODBC有时候好用有时候就不行?
- 数值转换的问题,高分,在线等!马上给!
- 请问哪位做过VOD视频点播系统,给点意见就行,分不够再加,谢谢
- 再次打扰,关于combobox
- ms flexgrid问题
- question??????????
- 如何在VB中使用ITaskbarList3
- 各位高手怎样对数据库进行“增删改查”急需解答?望各高手指教小弟!!!
- vb 中windowsmediaplayer控件问题
- 怎样实现两个表的联接查询......
- 我用label控件的mousemove使鼠标移到该控件上使上面的字体变色,但怎么使鼠标移出使字体颜色恢复
http://202.103.176.81/erun/adamyl/vbbooks/multithreading1.htm--------------------------------------------------------------------------------在此下载本文示例程序(134k)在VB中的多线程编程主要是通过COM部件来实现的。因此必须首先理解COM中的线程模型。COM在操作系统的线程模型之上放置了一个叫做“单元”(apartment)的一个抽象的概念。单元是在VB中创建可靠的多线程应用程序的关键。每个COM对象(换句话说也就是每个VB对象)都是在一个COM单元环境中被创建的。一个线程在创建并与COM对象交互之前必须首先找到并进入一个单元。目前COM定义了两种类型的单元:多线程单元(MTA)和单线程单元(STA)。
再form里加上两个timer控件. 吧interval属性设成5000(5秒),然后在两个timer1_timer事件中放一个大loop, 如for 10000 next. 运行. 你会看到第二个timer控件不会在五秒后执行,除非timer1的for-next结束. 同样,如果你的程序中有大量的数据库读写.你的用户街面可能被"冻".这时,我们就需要用多县城来改进程序了.(当然你可以用DoEvents来避免被冻,但用DoEvents有横多副作用.这里不提).我们用的第一个API是CreateThread, VB的格式是:private declare function CreateThread Lib "kernel32" (byval lpThreadAttributes as any, byval dwStackSize as long, byval lpStartAddress as long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as long. (从vb API text viewer中拿是最真确的语法)CreateThread的参数指出你将要创立的县城是什么样子的. CreateThread的返回值是一个县城的handle. 这里是vb的多县城初始化程序:Public Sub Initialize(lpfnBasFunc as long) dim dwStackSize as long dim dwCreationFlags as long dim lpThreadId as long dim lpParameter as long dim myNull as long myNull = 0& 'create a null pointer dwStackSize = 0 '0表示用exe stack size dwCreationFlags = 4 '用4表示初始化后先不激活,让别人来激活. Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId) if Me.Thread = myNull then Msgbox "create thread failed" end ifend Sub
下面是两个API用来激活/暂定该线程.private declare function ResumeThread lib "kernel32"(byval hThread as long)as longprivate declare function SuspendThread lib "kernel32"(byval hThread as long)as long让我们来用一个变量表示当前县城的状态.
public ThreadStatus as boolean
在vb里,可用property来实现ThreadStatus的管理.
Public property Let Enabled(byval vNewValue as boolean) if vNewValue = true and Me.ThreadStatus = false then ResumeThread Me.Thread Me.ThreadStatus = True elseif Me.ThreadStatus = true then SuspendThread Me.Thread Me.ThreadStatus = False endifend Property这个简单的类可以用New Object来引用:
'make new thread objectdim myThread as New clsThreads'创建县城 FoomyThread.Initialize AddressOf Foo'激活县城myThread.Enabled = True执行后,你可以用PVIEW95.EXE看到你的线程.
你还可以提高你的线程的优先级.
SetThreadPriority '设优先级GetThreadPriority '查优先级你把以上的程序加入timer例子,就会看到两个timer同时运行.
这里要提醒一下. vb5的开发环境是单县城的.如果你的程序写错,或中断后试图恢复,往往会出错,有时是GPF错.
总之,用vb写多线程可以写出和VC一样快的程序.而且开发容易的多,开发速度也快得多.抛砖引玉.希望能看到兽经,虎经,鳖经.....