Żeby użyć semafora trzeba utworzyć uchwyt. Robi się to dokładnie tak jak deklaruje zmienną: Piszemy:
HANDLE nazwa_semafora;
Aby utworzyć semafor musimy napisać:
nazwa_semafora = CreateSemaphore(NULL,4,4,NULL);
Znaczenie parametrów: 1-szy: NULL, tzn. semafor nie może być dziedziczony przez procesy potomne; 2-gi : wartość początkowa licznika ustawiona na 4; 3-ci : maksymalna wartość licznika 4 (chcemy "wpuścić" nie więcej niż 3 procesy) 4-ty : nazwa, ale ja zawsze daję NULL, bo nie za bardzo mi to działa :)
Trzeba zwrócić uwagę, żeby przypadkiem semafor nie został użyty zanim go utworzymy.
Używanie semafora w wątku:
Aby wątek od razu zajmował semafor trzeba w funkcji: void __fastcall Nazwa_Watku::Execute(); od razu na początku dopisać:
WaitForSingleObject(nazwa_semafora,INFINITE);
W efekcie jeśli semafor będzie wolny to wątek od razu zacznie wykonywanie, jeśli nie, to będzie czekał na zwolnienie semafora. Dzięki naszemu semaforowi możemy wykonywać jedynie max 4 wątki na raz. Zanim wątek skończy pracę należy zwolnić semafor poleceniem:
ReleaseSemaphore(nazwa_semafora,1,NULL);
Cyfra 1 oznacza zwiększenie licznika semafora o 1. Trzeba pamiętać, że w miarę jak semafor jest zajmowany, jego licznik się zmniejsza. Jeśli osiągnie 0 wtedy semafor jest całkowicie zajęty.
To: WaitForSingleObject(nazwa_semafora,INFINITE); polecenie trzeba dopisać do każdego wątku którym ma się "zająć" semafor :)
|