und
'MTDemo 3 - Multithreading example
'Copyright В© 1997 by Desaware Inc. All Rights Reserved
Option Explicit
Event DoneCounting ()
Dim l As Long
Public Function DoTheCount (ByVal finalval &) As Boolean
Dim s As String
If l = 0 Then
s $ = "In Thread" & App.threadid
Call MessageBox (0, s $, "", 0)
End If
l = l + 1
If l> = finalval Then
l = 0
DoTheCount = True
Call MessageBox (0, "Done with counting", "", 0)
RaiseEvent DoneCounting
End If
End Function
Клас розроблений так, щоб функція DoTheCount могла неодноразово викликатися з безперервного циклу у фоновому потоці. Ми могли б помістити цикл безпосередньо в сам об'єкт, але ви незабаром побачите, що були вагомі причини для проектування об'єкта як показано у прикладі. При першому виклику функції DoTheCount з'являється MessageBox, в якому показано ідентифікатор потоку, за яким ми можемо визначити потік, в якому виконується код. Замість VB команди MessageBox використовується MessageBox API, тому що функція API, як відомо, підтримує безпечне виконання потоків. Другий MessageBox з'являється після того, як закінчений підрахунок і Згенеровано подія, яка вказує, що операція закінчена.
Фоновий потік запускається за допомогою наступного коду у формі frmMTDemo3: Private Sub cmdCreateFree_Click ()
Set c = New clsBackground
StartBackgroundThreadFree c
End Sub
Функція StartBackgroundThreadFree визначена в модулі modMTBack наступним чином:
Declare Function CreateThread Lib "kernel32" _ p> (ByVal lpSecurityAttributes As Long, ByVal _
dwStackSize As Long, ByVal lpStartAddress As Long, _
ByVal lpParameter As Long, ByVal dwCreationFlags _
As Long, lpThreadId As Long) As Long
Declare Function CloseHandle Lib "kernel32" _ p> (ByVal hObject As Long) As Long
'Start the background thread for this object
'using the invalid free threading approach.
Public Function StartBackgroundThreadFree (ByVal qobj As clsBackground)
Dim threadid As Long
Dim hnd &
Dim threadparam As Long
'Free threaded approach
threadparam = ObjPtr (qobj)
hnd = CreateThread (0, 2000, AddressOf _
BackgroundFuncFree, threadparam, 0, threadid)
If hnd = 0 Then
'Return with zero (error)
Exit Function
End If
'We don't need the thread handle
CloseHandle hnd
StartBackgroundThreadFree = threadid
End Function
Функція CreateThread має шість параметрів:
lpSecurityAttributes - Зазвичай встановлюється в нуль, щоб використовувати задані за замовчуванням атрибути захисту. p> dwStackSize - розмір стека. Кожен потік має власний стек. p> lpStartAddress - Адреса пам'яті, де ...