|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
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. }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование Объектов Семафора
В следующем примере, процесс использует объект семафора против предела номер окна это создается. Сначала, это использует функцию CreateSemaphore, чтобы создавать семафор и, чтобы определять начальные и максимальные счеты.
ПРООПЕРИРУЙТЕ hSemaphore; ДОЛГО (ДЛИНОЙ) cMax = 10; ДОЛГО (ДЛИНОЙ) cPreviousCount; // Создайте семафору с инициалом и max. счетами 10.
hSemaphore = CreateSemaphore( НЕДЕЙСТВИТЕЛЬНЫЕ, // никакие атрибуты безопасности cMax, // начальный счет cMax, // максимальный счет НЕДЕЙСТВИТЕЛЬНЫЙ); // безымянный семафор
если (hSemaphore == НЕДЕЙСТВИТЕЛЬНЫЙ) { // Чек ошибки. }
Прежде, чем любая резьба процесса создаст новое окно, она использует функцию WaitForSingleObject, чтобы определять разрешает текущий счет семафора создание дополнительного окна. Параметр функциональной задержки ожидания установлен в нуль, так что функция возвращается немедленно если семафор nonsignaled.
DWORD dwWaitResult; // Попытка, чтобы вводить ворота семафора.
dwWaitResult = WaitForSingleObject( hSemaphore, // РУЧКА семафора 0L); // интервал нулевой секунды задержки
ключ (dwWaitResult) {
// Объект семафора был сигнализирован. случай WAIT_OBJECT_0: // OK, чтобы открывать другое окно. прерывание;
// Семафор nonsignaled, так что задержка происходила. случай WAIT_TIMEOUT: // Не мочь открыть другое окно.
прерывание; }
Когда резьба закрывает окно, она использует функцию ReleaseSemaphore, чтобы увеличивать счет семафора.
// Приращение счет семафора. если (!ReleaseSemaphore( hSemaphore, // РУЧКА семафора 1, // счет увеличения одним НЕДЕЙСТВИТЕЛЬНЫМ) ) // не заинтересованный в предшествующем счете { // Сделка с ошибкой. }
|
|
|
|
| |