MSDN搜索 ‘單元模型線程’,這里有詳細vb使用線程的說明
一、 多線程注意事項:
1 若要終止線程的運行,可以使用下面四種的方法:
一、線程函數退出循環來返回 (最佳方法 )。
二、通過調用ExitThread 函數,線程將自行撤消(盡量不要使用這種方法 )。
三、同一個進程或另一個進程中的線程調用TerminateThread 函數(最好避免使用這種方法 )。
四、該線程的主進程終止運行(避免使用 )。
下面將介紹終止線程運行的方法,並且說明線程終止運行時會出現什么情況。
1.1 線程函數返回
始終都應該將線程設計成這樣的形式,即當想要線程終止運行時,它們就能夠返回。這是確保所有線程資源被正確地清除的唯一辦法。如果線程能夠返回,就可以確保下列事項的實現:
1. 在線程函數中創建的所有C + +對象均將通過它們的撤消函數正確地撤消。
2. 操作系統將正確地釋放線程堆棧使用的內存。
3. 系統將線程的退出代碼(在線程的內核對象中維護)設置為線程函數的返回值。
4. 系統將遞減線程內核對象的使用計數。
二、VB實現多線程簡單實例
1、先建立一個窗口,並向窗口中添加兩個CommandButton控件和一個Label控件
2、修改Command1的Caption為“開始線程”
3、修改Command2的Caption為“停止線程”
1 Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, _ 2 ByVal dwStackSize As Long, _ 3 ByVal lpStartAddress As Long, _ 4 ByVal lpParameter As Long, _ 5 ByVal dwCreationFlags As Long, _ 6 lpThreadId As Long) As Long 7 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 8 9 Private Sub Command1_Click() 10 Dim SendThreadID As Long 11 Dim ClassAddress As Long 12 IsRun = 1 13 CopyMemory ClassAddress, Me, 4 14 Call CreateThread(Null, ByVal 0&, AddressOf Module1.NewThread, ClassAddress, ByVal 0&, SendThreadID) 15 End Sub 16 17 Private Sub Command2_Click() 18 IsRun = 0 19 End Sub
然后向工程中添加一個模塊 Module1,Module1 代碼如下:
1 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 2 Private Declare Function GetTickCount Lib "kernel32" () As Long 3 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 4 Public IsRun As Long 5 6 Public Function NewThread(ByVal pParam As Long) As Long 7 Dim lSaveTime As Long 8 Dim lNowTime As Long 9 Dim FormObj As Form1 10 Dim i As Long 11 Dim ClassAddress As Long 12 Dim MCount As Long 13 Dim SCount As Long 14 lSaveTime = GetTickCount 15 MCount = 0 16 i = 0 17 ClassAddress = 0 18 CopyMemory FormObj, pParam, 4 19 Do 20 Sleep 3 21 lNowTime = GetTickCount 22 SCount = lNowTime - lSaveTime 23 If SCount > 1000 Then 24 lSaveTime = lNowTime 25 i = i + 1 26 FormObj.Label1.Caption = i & " 秒(線程運行時間)" 27 End If 28 Loop While IsRun = 1 29 CopyMemory FormObj, ClassAddress, 4 30 End Function
其中使用CopyMemory 這個Windows API應注意:
1) 在VB中由於沒有明確的指針定義,涉及到指針操作是通過API函數copymemory來進行,相對於C等語言來說形式上沒有那么嚴格要求,因此外形上看很不明晰。
2) 在 VB 中出於安全考慮,不能直接訪問內存,但你可以使用 CopyMemory(RtlMoveMemory) 的 API 來復制指定區域的內存。
3) 其具體聲明如下:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Destination 是指向復制目標的指針,可以直接指定為某個變量或是數組(如果是數組應使用 myArray(0) 或是 myArray(n) 來指定覆蓋的起點,不能直接使用 myArray),或是使用 ByVal 關鍵字加內存地址
Source 是復制源的指針,用法與上面一樣
Length 是復制的長度,以字節為單位。
4) VB 6 中沒有公開的三個函數:VarPtr,StrPtr,ObjPtr它們分別返回變量、字符串(UNICODE)、對象的指針(就是內存地址)
5) CopyMemory 只負責復制,不負責分配內存。
參考: 1. VB中有關CopyMemory的若干問題
2. CopyMemory函數
3. VB多線程安全退出問題的討論
4. Active X多線程問題的討論
5. COM多線程原理與應用
6. VB下多線程機制比較