![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странное поведение функции TryEnterCriticalSection() [D5, WinXP]
Th © (2004-09-28 16:15:00)Следующий код работает как-то не очень.. Первый раз функция TryEnterCriticalSection() входит в критическую секцию и возвращает true, а вот во второй раз не желает - всегда false, хотя LeaveCriticalSection() вызывается перед вторым разом. EnterCriticalSection() вместо TryEnterCriticalSection() работает нормально.
try
if not TryEnterCriticalSection(SocketCS) then
raise Exception.Create('Service is busy by another client')
else
begin
{...}
end;
finally
LeaveCriticalSection(SocketCS)
end;
подскажите плз, в чем грабли?
Th (2004-09-28 16:40:00) [1]спасибо, именно это и было - LockCOunt оказывался -2 из-за того, что LeaveCriticalSection дергалась лишний раз в другом месте..
Almaz (2004-09-28 16:29:00) [2]Обратите внимание на свой код: если TryEnterCriticalSection вернет FALSE то инициируется исключение и в finally будет вызвана LeaveCriticalSection, хотя входа в секцию осуществлено не было. TryEnterCriticalSection возвращает True только если число вызовов EnterCriticalSection и LeaveCriticalSection совпадает. Т.е. если LeaveCriticalSection вызвано без EnterCriticalSection, то TryEnterCriticalSection вернет FALSE. Учтите это при проектировании Вашего приложения и все заработает.
Например приведенный выше код измените на:
if not TryEnterCriticalSection(SocketCS) then
raise Exception.Create('Service is busy by another client')
else
try
...
finally
LeaveCriticalSection(SocketCS)
end;
Удачи.
p.s. Простой пример:
InitializeCriticalSection(SocketCS);
LeaveCriticalSection(SocketCS);
if TryEnterCriticalSection(SocketCS) then
ShowMessage('True')
else
ShowMessage('False');
Th (2004-09-28 16:20:00) [3]Все, сорри, вопрос снят.