C'est assez dommage (mais c'est le principe des Mutex de L'API Windows également), car si on veut que le programme principale soit bloqué jusqu'à ce qu'un Thread qui vient d'être créé soit totalement initialisé (ou ai effectué une action), ça ne marche pas...
Voici un exemple :
Code : Tout sélectionner
Global m = CreateMutex()
Procedure Thread(void)
Debug "Thread is running"
Delay(Random(3)*100)
Debug "< < <"
UnlockMutex(m)
EndProcedure
Procedure LaunchTread()
LockMutex(m)
Debug "> > >"
t = CreateThread(@Thread(), 0)
EndProcedure
For i = 1 To 5
LaunchTread()
Next i
Delay(1000)
Voici le mm code, mais avec des Semaphores :
Code : Tout sélectionner
;------------------- Semaphore Functions ------------------------
Macro Sem_Create(Init, Max)
CreateSemaphore_(#Null, Init, Max, #Null)
EndMacro
Macro Sem_Acquire(Sem)
WaitForSingleObject_(Sem, #INFINITE)
EndMacro
Macro Sem_ReleaseSeveral(Sem, nb)
ReleaseSemaphore_(Sem, nb, #Null)
EndMacro
Macro Sem_Release(Sem)
ReleaseSemaphore_(Sem, 1, #Null)
EndMacro
;---------------- End of Semaphore Functions ---------------------
Global m = Sem_Create(1, 1)
Procedure Thread(void)
Debug "Thread is running"
Delay(Random(3)*100)
Debug "< < <"
Sem_Release(m)
EndProcedure
Procedure LaunchTread()
Sem_Acquire(m)
Debug "> > >"
t = CreateThread(@Thread(), 0)
EndProcedure
For i = 1 To 5
LaunchTread()
Next i
Delay(1000)
Lio

