2024年4月2日发(作者:)

怎样用vb写多线程

原文出自:/faq/vbvc/

原文是V*著名选手darkside 所写

黑经:怎样用vb写多线程.

Posted by darkside on August 04, 1998 at 15:37:13:

尽管vb5是apprent single-thread(单线程)的.但用addressof加上一些API,就可

以非常容易的做多线程.(比VC容易的多,做出来的东西也一样快,因为都是用API). 每一

个县城(线程,下同)约占用20毫秒的时间片.

vb5有一个主线程.我们可以另外加一个工作线程.对于不清楚什么是单/多线程的程序

元,我们用一个简单的列子来说明一下.

再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 pThreadAttributes as any, byval dwStackSize as long, b

yval lpStartAddress as long, lpParameter as any, byval dwCreatio

nFlags 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表示初始化后先不激活,让别人来激活.

= CreateThread(myNull, dwStackSize, lpfnBasFunc, myN

ull, dwCreationFlags, lpThreadId)

if = myNull then

Msgbox "create thread failed "

end if

end Sub

下面是两个API用来激活/暂定该线程.

private declare function ResumeThread

"(byval hThread as long)as longprivate

declare function SuspendThread

"(byval hThread as long)as long

让我们来用一个变量表示当前县城的状态.

public ThreadStatus as boolean

在vb里,可用property来实现ThreadStatus的管理.

Public property Let Enabled(byval vNewValue

lib "kernel32

lib "kernel32

as boolean)

if vNewValue = true and Status = false then

ResumeThread

Status = True

elseif Status = true then

SuspendThread

Status = False

endif

end Property

这个简单的类可以用New Object来引用:

'make new thread object

dim myThread as New clsThreads

'创建县城 Foo

lize AddressOf Foo

'激活县城

d = True

执行后,你可以用看到你的线程.

你还可以提高你的线程的优先级.

SetThreadPriority '设优先级GetThreadPriority '查优先级

你把以上的程序加入timer例子,就会看到两个timer同时运行.

这里要提醒一下. vb5的开发环境是单县城的.如果你的程序写错,或中断后试图恢复,

往往会出错,有时是GPF错.

总之,用vb写多线程可以写出和VC一样快的程序.而且开发容易的多,开发速度也快得

多.