Miejscem na utworzenie semafora jest plik główny projektu, czyli ten, gdzie znajduje się funkcja WinMain().
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE hSemaphore = CreateSemaphore(NULL, //atrybuty ochrony czy coś
1, //poczatkowy stan licznika
5, //max stan licznika
"MOJ.SEMAPHORE" //nazwa semafora
);
Próbuje stworzyć semafor, jeżeli już jest system zwróci poprzedni, bez tworzenia nowego, wtedy olewa parametry licznika.
Wartość semafora zostanie zmniejszona przy każdym wywołaniu WaitForSingeObject();
Kiedy WaitForSingleObject() zwróci WAIT_OBJECT_0, oznacza to, że wartość semafora wyzerowała się.
if(hSemaphore && WaitForSingleObject(hSemaphore, 0)!= WAIT_OBJECT_0){
CloseHandle(hSemaphore);
ShowMessage("Aplikacja jest już odpalona na maxa!");
return 0;
}
Na końcu funkcji WinMain() zwalniamy semafor co ziwekasza jego wartość
ReleaseSemaphore(hSemaphore,1,NULL);
CloseHandle(hSemaphore);
to tyle. w najprostrzej wersji hhehee. Jak zadziala to extra. Jak nie to lipa ehheeehe.
A tu troche lepiej o synchro: https://www.ii.uni.wroc.pl/~wzychla/ra2223/so2.html