информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Logitech готовится закрыть очередную... 
 Серьёзная атака на инфраструктуру... 
 Microsoft призналась в сознательном... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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. Решение конечно не такое красивое, но мне подходит.

Тема закрыта.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach