ub Main:
'MTDemo2 - Multithreading demo program
'Copyright В© 1997 by Desaware Inc. All Rights Reserved
Option Explicit
Declare Function FindWindow Lib "user32" Alias ​​"FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub Main ()
Dim f As frmMTDemo2
'We need this because Main is called on each new thread
Dim hwnd As Long
hwnd = FindWindow (vbNullString, "Multithreading Demo2 ")
If hwnd = 0 Then
Set f = New frmMTDemo2
f.Show
Set f = Nothing
End If
End Sub
Перший раз програма завантажує і відображає основну форму додатку. Підпрограма Main має з'ясувати, чи є це першим потоком програми, тому цей код виконується при старті кожного потоку. Ви не можете використовувати глобальну змінну, щоб це з'ясувати, тому що Visual Basic apartment model зберігає глобальні змінні специфічними для одиночного потоку. У цьому прикладі використовується функція API FindWindow, щоб перевірити, чи була завантажена основна форма прикладу. Є інші способи з'ясувати, чи є це основним потоком, включаючи використання об'єктів синхронізації системи - але це окрема тема для розмови.
Багатопотоковий режим реалізується створенням об'єкта в новому потоці. Об'єкт повинен бути визначено, використовуючи модуль класу. У цьому випадку, простий модуль класу визначається наступним чином:
'MTDemo2 - Multithreading demo program
'Copyright В© 1997 by Desaware Inc. All Rights Reserved
Option Explicit
Private Sub Class_Initialize ()
Dim f As New frmMTDemo2
f.Show
Set f = Nothing
End Sub
Ми можемо встановити змінну форми як nothing після того, як вона створена, тому що після відображення форми вона буде збережена.
'MTDemo2 - Multithreading demo program
'Copyright В© 1997 by Desaware Inc. All Rights Reserved
Option Explicit
Private Sub cmdLaunch1_Click ()
Dim c As New clsMTDemo2
c.DisplayObjPtr Nothing
End Sub
Private Sub cmdLaunch2_Click ()
Dim c As clsMTDemo2
Set c = CreateObject ("MTDemo2.clsMTDemo2")
End Sub
Private Sub Form_Load ()
lblThread.Caption = Str $ (App.ThreadID)
End Sub
Форма відображає ідентифікатор потоку в мітці на формі. Форма містить дві командні кнопки, одна з яких використовує оператор New, інша-використовує оператор CreateObject. p> Якщо Ви запустіть програму всередині середовища Visual Basic, то побачите, що форми завжди створюються в одному і тому ж потоці. Це відбувається, тому що середовище Visual Basic підтримує тільки одиночний потік. Якщо Ви скомпілюєте і запустіть програму, то побачите, що підхід, що використовує CreateObject створює і clsMTDemo2 і її форму у новому потоці.
Чому багато...