VB無所不能之七:VB的多線程(2)作者:鐘聲友情連結(非廣告,完全是出於友情):雲查殺很牛X的金山毒霸!免費啦!2011下載連結!
久違啦,我今天終於又可以寫部落格了,VB無所不能這個系列寫作途中總是磕磕絆絆的,終於寫到第七篇多線程的時候,中斷了長達1個多月的時間沒有更新新帖,對大家說聲抱歉,由於本人這個月遇到很多棘手之事情,沒有顧得上。
好了,言歸正傳了,繼續我們的VB無所不能之旅。 上一篇我們在《VB多線程(1)》中給大家介紹了在VB中使用多線程的兩個函數,一個是“
CreateThread ”另一個是“
Sleep”,這兩個是使用多線程時用到的
Windows的
kernel32提供的API函數。 那麼,本篇將具體用一個執行個體說明一下這兩個函數是如何使用的。 我們上文提到,“VB的大部分控制項都不是安全執行緒的”,因此,沒有使用我們很熟悉的Text控制項,我們為了完成本程式需要用到GDI函數繪圖來實現多線程實現部分。 我們會用到如下GDI函數,其聲明及說明如下:
擷取表單控制代碼的DC:
Public Declare Function
GetDC Lib "user32" (ByVal hwnd As Long) As Long
設定繪製地區的背景色,也起清除作用:Public Declare Function
SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
輸出文本:
Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
釋放資源:
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long 好,那麼,我們開始建立程式: 步驟一:建立一個Module添加如下代碼: Declare Function GetDC Lib "user32" () Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetBkColor Lib "gdi32" () Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Declare Function TextOut Lib "gdi32" Alias "TextOutA" () Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Declare Function ReleaseDC Lib "user32" () Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Declare Function CreateThread Lib "kernel32" () Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Declare Sub Sleep Lib "kernel32" () Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'全域的form的控制代碼!
Public formhandle As Long
OutText1() OutText1() '過程一
Dim i As Long
Dim dc As Long
Dim s As String
dc = GetDC(formhandle) '擷取表單控制代碼的DC
For i = 1 To 100000
s = CStr(i)
Call SetBkColor(dc, &HF0F0F0) '設定繪製地區的背景色,也起清除作用
Call TextOut(dc, 10, 10, s, Len(s)) '輸出文本!
Call Sleep(40) '等待
Next
Call ReleaseDC(formhandle, dc) '釋放資源!
End Sub
OutText2() OutText2() '和過程一類似
Dim i As Long
Dim dc As Long
Dim s As String
dc = GetDC(formhandle)
For i = 1 To 100000
s = CStr(i)
Call SetBkColor(dc, &HF0F0F0)
Call TextOut(dc, 10, 80, s, Len(s)) '文本位置改變了
Call Sleep(20) '延時改變了
Next
Call ReleaseDC(formhandle, dc)
End Sub 步驟二:建立一個表單,添加如下組件,: 步驟三:在表單中添加如下代碼: Sub Command1_Click() Sub Command1_Click()
'聲明了線程ID
Dim threadid1 As Long
Dim threadid2 As Long
Call CreateThread(Null, ByVal O&, AddressOf Module1.OutText1, VarPtr(0), ByVal 0&, threadid1)
Call CreateThread(Null, ByVal 0&, AddressOf Module1.OutText2, VarPtr(0), ByVal 0&, threadid2)
End Sub
Sub Form_Load() Sub Form_Load()
'儲存表單控制代碼全域變數,用於在form 上繪圖
formhandle = Form1.hwnd
End Sub 好,我們再來看運行效果,: 好了,本文實現了一個初步的多線程調用的例子,剩下的事情就請大家八仙過海各顯神通了!!
鐘聲寫的關於Java方面的書: 《Java程式員,上班那點事兒》:
前言,目錄
卓越網銷售連結
China-pub銷售連結
噹噹網銷售連結
《Java程式員,上班那點事》紀念帖關於下載《Java程式員,上班那點事兒》的電子版
--------------------------------------------