l Rights Reserved
Option Explicit
Dim State As Integer
'State = 0 - Idle
'State = 1 - Loading existing value
'State = 2 - Adding 1 to existing value
'State = 3 - Storing existing value
'State = 4 - Extra delay
Dim Accumulator As Long
Const OtherCodeDelay = 10
Private Sub Command1_Click ()
Dim f As New frmMTDemo1
f.Show
End Sub
Private Sub Form_Load ()
Timer1.Interval = 750 + Rnd * 500
End Sub
Private Sub Timer1_Timer ()
Static otherdelay &
Select Case State
Case 0
lblOperation = "Idle"
State = 1
Case 1
lblOperation = "Loading Acc"
Accumulator = GenericGlobalCounter
State = 2
Case 2
lblOperation = "Incrementing"
Accumulator = Accumulator + 1
State = 3
Case 3
lblOperation = "Storing"
GenericGlobalCounter = Accumulator
TotalIncrements = TotalIncrements + 1
State = 4
Case 4
lblOperation = "Generic Code"
If otherdelay> = OtherCodeDelay Then
State = 0
otherdelay = 0
Else
otherdelay = otherdelay + 1
End If
End Select
UpdateDisplay
End Sub
Public Sub UpdateDisplay ()
lblGlobalCounter = Str $ (GenericGlobalCounter)
lblAccumulator = Str $ (Accumulator)
lblVerification = Str $ (TotalIncrements)
End Sub
Ця програма для моделювання багатопотокового режиму використовує таймер і простий кінцевий автомат. Мінлива State описує п'ять команд, які ця програма виконує. State = 0 - неактивний стан. State = 1 завантажує локальну змінну глобальної змінної GenericGlobalCounter. State = 2 збільшує на одиницю локальну змінну. State = 3 запам'ятовує результат у змінній GenericGlobalCounter і збільшує змінну TotalIncrements (яка вважає кількість збільшень змінної GenericGlobalCounter). State = 3 додає додаткову затримку, що представляє собою час, витрачений на виконання інших команд в програмі.
Функція UpdateDisplay оновлює три мітки на формі, які показують поточне значення змінної GenericGlobalCounter, локального суматора, і загальної кількості збільшень.
Кожен сигнал таймера моделює цикл центральний процесор у поточному потоці. Якщо Ви запустіть програму, то побачите, що значення змінної GenericGlobalCounter буде завжди точно одно змінної TotalIncrements, тому що змінна TotalIncrements показує кількість збільшень лічильника GenericGlobalCounter потоком.
Але що трапиться, коли Ви натискаєте кнопку Command1 і запустіть другий примірник форми? Ця нова форма змоделює другий потік. p> Час від часу, команди вишикуються в лінію таким чином, що обидві форми завантажать однакове значення GenericGlobalCounter, збільшать і збережуть його. У результаті, значення ...