盡管VB5是apprent single-thread(單線程)的.但用addressof加上一些API,就可以非常容易的做多線程.(比VC容易的多,做出來(lái)的東西也一樣快,因?yàn)槎际怯肁PI). 每一個(gè)縣城(線程,下同)約占用20毫秒的時(shí)間片.
vb5有一個(gè)主線程.我們可以另外加一個(gè)工作線程.對(duì)于不清楚什么是單/多線程的程序元,我們用一個(gè)簡(jiǎn)單的列子來(lái)說(shuō)明一下.
再form里加上兩個(gè)timer控件. 吧interval屬性設(shè)成5000(5秒),然后在兩個(gè)timer1_timer事件中放一個(gè)大loop, 如for 10000 next. 運(yùn)行. 你會(huì)看到第二個(gè)timer控件不會(huì)在五秒后執(zhí)行,除非timer1的for-next結(jié)束. 同樣,如果你的程序中有大量的數(shù)據(jù)庫(kù)讀寫(xiě).你的用戶街面可能被"凍".這時(shí),我們就需要用多縣城來(lái)改進(jìn)程序了.(當(dāng)然你可以用DoEvents來(lái)避免被凍,但用DoEvents有橫多副作用.這里不提).
我們用的第一個(gè)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. (從vb API text viewer中拿是最真確的語(yǔ)法)
CreateThread的參數(shù)指出你將要?jiǎng)?chuàng)立的縣城是什么樣子的. CreateThread的返回值是一個(gè)縣城的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表示初始化后先不激活,讓別人來(lái)激活.
Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId)
if Me.Thread = myNull then
Msgbox "create thread failed"
end if
end Sub
下面是兩個(gè)API用來(lái)激活/暫定該線程.
private declare function ResumeThread lib "kernel32"(byval hThread as long)as longprivate declare function SuspendThread lib "kernel32"(byval hThread as long)as long
讓我們來(lái)用一個(gè)變量表示當(dāng)前縣城的狀態(tài).
public ThreadStatus as boolean
在vb里,可用property來(lái)實(shí)現(xiàn)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
endif
end Property
這個(gè)簡(jiǎn)單的類可以用New Object來(lái)引用:
'make new thread object
dim myThread as New clsThreads
'創(chuàng)建縣城 Foo
myThread.Initialize AddressOf Foo
'激活縣城
myThread.Enabled = True
執(zhí)行后,你可以用PVIEW95.EXE看到你的線程.
你還可以提高你的線程的優(yōu)先級(jí).
SetThreadPriority '設(shè)優(yōu)先級(jí)GetThreadPriority '查優(yōu)先級(jí)
你把以上的程序加入timer例子,就會(huì)看到兩個(gè)timer同時(shí)運(yùn)行.
這里要提醒一下. vb5的開(kāi)發(fā)環(huán)境是單縣城的.如果你的程序?qū)戝e(cuò),或中斷后試圖恢復(fù),往往會(huì)出錯(cuò),有時(shí)是GPF錯(cuò).總之,用vb寫(xiě)多線程可以寫(xiě)出和VC一樣快的程序.而且開(kāi)發(fā)容易的多,開(kāi)發(fā)速度也快得多.
拋磚引玉.希望能看到獸經(jīng),虎經(jīng),鱉經(jīng).....
vb5有一個(gè)主線程.我們可以另外加一個(gè)工作線程.對(duì)于不清楚什么是單/多線程的程序元,我們用一個(gè)簡(jiǎn)單的列子來(lái)說(shuō)明一下.
再form里加上兩個(gè)timer控件. 吧interval屬性設(shè)成5000(5秒),然后在兩個(gè)timer1_timer事件中放一個(gè)大loop, 如for 10000 next. 運(yùn)行. 你會(huì)看到第二個(gè)timer控件不會(huì)在五秒后執(zhí)行,除非timer1的for-next結(jié)束. 同樣,如果你的程序中有大量的數(shù)據(jù)庫(kù)讀寫(xiě).你的用戶街面可能被"凍".這時(shí),我們就需要用多縣城來(lái)改進(jìn)程序了.(當(dāng)然你可以用DoEvents來(lái)避免被凍,但用DoEvents有橫多副作用.這里不提).
我們用的第一個(gè)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. (從vb API text viewer中拿是最真確的語(yǔ)法)
CreateThread的參數(shù)指出你將要?jiǎng)?chuàng)立的縣城是什么樣子的. CreateThread的返回值是一個(gè)縣城的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表示初始化后先不激活,讓別人來(lái)激活.
Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId)
if Me.Thread = myNull then
Msgbox "create thread failed"
end if
end Sub
下面是兩個(gè)API用來(lái)激活/暫定該線程.
private declare function ResumeThread lib "kernel32"(byval hThread as long)as longprivate declare function SuspendThread lib "kernel32"(byval hThread as long)as long
讓我們來(lái)用一個(gè)變量表示當(dāng)前縣城的狀態(tài).
public ThreadStatus as boolean
在vb里,可用property來(lái)實(shí)現(xiàn)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
endif
end Property
這個(gè)簡(jiǎn)單的類可以用New Object來(lái)引用:
'make new thread object
dim myThread as New clsThreads
'創(chuàng)建縣城 Foo
myThread.Initialize AddressOf Foo
'激活縣城
myThread.Enabled = True
執(zhí)行后,你可以用PVIEW95.EXE看到你的線程.
你還可以提高你的線程的優(yōu)先級(jí).
SetThreadPriority '設(shè)優(yōu)先級(jí)GetThreadPriority '查優(yōu)先級(jí)
你把以上的程序加入timer例子,就會(huì)看到兩個(gè)timer同時(shí)運(yùn)行.
這里要提醒一下. vb5的開(kāi)發(fā)環(huán)境是單縣城的.如果你的程序?qū)戝e(cuò),或中斷后試圖恢復(fù),往往會(huì)出錯(cuò),有時(shí)是GPF錯(cuò).總之,用vb寫(xiě)多線程可以寫(xiě)出和VC一樣快的程序.而且開(kāi)發(fā)容易的多,開(kāi)發(fā)速度也快得多.
拋磚引玉.希望能看到獸經(jīng),虎經(jīng),鱉經(jīng).....

