Форум: "WinAPI";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение функции TryEnterCriticalSection() Найти похожие ветки
← →
Th (2004-09-28 16:15) [0]Следующий код работает как-то не очень.. Первый раз функция 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:20) [1]Все, сорри, вопрос снят.
← →
Almaz © (2004-09-28 16:29) [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:40) [3]спасибо, именно это и было - LockCOunt оказывался -2 из-за того, что LeaveCriticalSection дергалась лишний раз в другом месте..
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.035 c