Andrzej - 2010-01-15 17:50:49

Ż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 :)

www.polisharmyclan.pun.pl www.blogomania.pun.pl www.1czs2.pun.pl www.serwer-metin2.pun.pl www.narutovsneji.pun.pl