80,Q:怎样用 VB 编写多线程程序
A:尽管 VB5.0 是单线程的,但用 addressof 加上一些 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, byval lpStartAddress as
long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as
long
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 if
End Sub
下面是两个 API 用来激活/暂停该线程:
private declare function ResumeThread lib "kernel32"(byval hThread as
long)as long
private 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
end if
End Property
这个简单的类可以用 New Object 来引用:
'make new thread object
dim myThread as New clsThreads '创建县城 Foo
myThread.Initialize AddressOf Foo '激活县城
myThread.Enabled = True
执行后,你可以用 PVIEW95.EXE 看到你的线程。你还可以提高你的线程的优先级:
SetThreadPriority '设优先级
GetThreadPriority '查优先级
你把以上的程序加入 timer 例子,就会看到两个 timer 同时运行。
这里要提醒一下,VB5 的开发环境是单线程的,如果你的程序写错,或中断后试图恢复,往往会出错,有时是严重出错。总之,用 VB 的多线程可以写出和
VC++ 一样快的程序,而且开发容易的多,开发效率也快得多。 |