Proměnné modulu jsou sdílené mezi vlákny. Tam je potřeba přístup synchronizovat, pokud jsou to proměnné, kde by to způsobilo problém.
Ty funkce běží současně, jen kritické části se právě synchronizují tak, aby si navzájem neškodily.
Dejme tomu, že máš kolekci (colWork), ke které nejde přistupovat z několika vláken současně. (Nebo několik souvisejících proměnných, nemusí to být jen jedna). Tak ji můžeš chránit zámkem (lckWork) nějak takhle:
Dim lckWork As Lock
Dim colWork As Collection
Sub AddWork(ByRef work As WorkData)
lckWork.Lock()
colWork.Add(work)
lckWork.Unlock()
End Sub
Function GetWork() As WorkData
Dim work as WorkData
Set work = Nothing
lckWork.Lock()
If colWork.Count > 0 Then
Set work = colWork.Remove(1)
End if
lckWork.Unlock()
Set GetWork = work
End Function
A pak jsi třeba ještě v aplikaci, se kterou taky musíš komunikovat sériově (podle jiného dotazu možná tvůj případ). Tak to zase synchronizuješ (lckApp):
Dim lckApp as Lock
Sub AppReportProgress()
lckApp.Lock()
app.WorkFinished(1)
lckApp.Unlock()
End Sub
A nakonec třeba 3 vlákna a nikde se nic nepere.
Sub ThreadProc()
Dim work as WorkData
Set work = GetWork()
If work Is Nothing Then
' pockat na praci. idealne pomoci semaforu.
Sleep(5)
Else
' delat zadanou praci
AppReportProgress()
End If
End Sub
app.RegisterConsumer(AddWork)
RunInThread(ThreadProc)
RunInThread(ThreadProc)
RunInThread(ThreadProc)
Je to pseudokód, VB si moc nepamatuju. Někde najdi, jak se dělá ten lock.