Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Как определить текущий счётчик семафора 13.09.09 06:57
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 13.09.09 07:02 Количество правок: 2
|
Пытаюсь сделать это при помощи функции
BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG cReleaseCount, LPLONG lpPreviousCount)
В документации написано, что если вызвать функцию ReleaseSemaphore со значением счётчика, превышающим cSemMax (максимальное значение семафора), то текущее значение счётчика не изменится, а в lpPreviousCount будет помещено текущее значение.
У меня данная афёра не прошла - в lpPreviousCount возвращается 0xcccccccc. Что делать?
PS. Функция возвращает FALSE (как это написано в документации), а GetLastError возвращает ошибку 298 (слишком много попыток занесения события для семафора).
Вот код моей функции:
LONG GetCountActiveThreads()
{
LONG lCount;
if (NULL != hSemaphore)
{
ReleaseSemaphore(hSemaphore, 2*appProfile.dwParallel, &lCount);
return appProfile.dwParallel-lCount;
}
else
return 0;
}
---
|
|
[Win32] Похоже только через NtQuerySemaphore 13.09.09 09:39
Автор: amirul <Serge> Статус: The Elderman
|
> В документации написано, что если вызвать функцию > ReleaseSemaphore со значением счётчика, превышающим cSemMax > (максимальное значение семафора), то текущее значение > счётчика не изменится, а в lpPreviousCount будет помещено > текущее значение.
Ничего подобного в документации не написано:
lReleaseCount
The amount by which the semaphore object's current count is to be increased. The value must be greater than zero. If the specified amount would cause the semaphore's count to exceed the maximum count that was specified when the semaphore was created, the count is not changed and the function returns FALSE.
> У меня данная афёра не прошла - в lpPreviousCount > возвращается 0xcccccccc. Что делать? Это не возвращенное значение, а неизмененное. В дебаг билдах неинициализированные стековые переменные инициализируются вот этим вот 0xcc. В релизе кажись так и остаются неинициализированными.
Собственно сабж. Хвала богам, о совместимости с 9x беспокоиться не нужно. Использование недокументированного апи - это, конечно, плохо (если что я тебе этого не советовал ;-) ), но если очень нужно, то можно.
|
| |
Каюсь, я не в доках это прочитал, а в книге Джонсона Харта... 13.09.09 11:10
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Каюсь, я не в доках это прочитал, а в книге Джонсона Харта "Системное программирование в среде Win32". Оттуда я и почерпнул информацию. До этого меня эта книга не подводила.
С нейтив-апи заморачиваться нету желания. Жаль, что нельзя определять текущий счётчик, но я вроде бы нашёл выход: создал глобальную переменную, которую помещаю в качестве последнего параметра функции ReleaseSemaphore. Решение конечно не такое красивое, но мне подходит.
Тема закрыта.
|
|
|