Using Semaphore Objects

In the following example, a process uses a semaphore object to limit the number of windows it creates. First, it uses the CreateSemaphore function to create the semaphore and to specify initial and maximum counts.

HANDLE hSemaphore;

LONG cMax = 10;

LONG cPreviousCount;

// Create a semaphore with initial and max. counts of 10.

hSemaphore = CreateSemaphore(

NULL, // no security attributes

cMax, // initial count

cMax, // maximum count

NULL); // unnamed semaphore

if (hSemaphore == NULL)

{

// Check for error.

}

Before any thread of the process creates a new window, it uses the WaitForSingleObject function to determine whether the semaphore's current count permits the creation of additional windows. The wait function's time-out parameter is set to zero, so the function returns immediately if the semaphore is nonsignaled.

DWORD dwWaitResult;

// Try to enter the semaphore gate.

dwWaitResult = WaitForSingleObject(

hSemaphore, // handle of semaphore

0L); // zero-second time-out interval

switch (dwWaitResult) {

// The semaphore object was signaled.

case WAIT_OBJECT_0:

// OK to open another window.

break;

// Semaphore was nonsignaled, so a time-out occurred.

case WAIT_TIMEOUT:

// Cannot open another window.

break;

}

When a thread closes a window, it uses the ReleaseSemaphore function to increment the semaphore's count.

// Increment the count of the semaphore.

if (!ReleaseSemaphore(

hSemaphore, // handle of semaphore

1, // increase count by one

NULL) ) // not interested in previous count

{

// Deal with the error.

}

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database