Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Вниз

Освобождение CRITICAL_SECTION   Найти похожие ветки 

 
Ломброзо   (2004-01-18 14:48) [0]

пусть есть такой код

procedure TMyClass.Foo();
var
CS: CRITICAL_SECTION;
begin
InitializeCriticalSection(@CS);
EnterCriticalSection(@CS);
raise Exception.Create("");
LeaveCriticalSection(@CS);
DeleteCriticalSection(@CS);
end;

Освободятся ли в этом случае ресурсы, захваченные объектом "критическая секция", автоматически при выходе из функции? И вообще, как в таких случаях грамотно структурировать код?


 
Тимохов   (2004-01-18 15:10) [1]

Удалить или нет не знаю: всегда юзаю дельфовую оболочку для крит. секции.

Но структура должна быть такая

InitializeCriticalSection(@CS);
try
EnterCriticalSection(@CS);
try
raise Exception.Create("");
finally
LeaveCriticalSection(@CS);
end;
finally
DeleteCriticalSection(@CS);
end;


 
Тимохов   (2004-01-18 15:11) [2]

Удалить или нет...


 
Тимохов   (2004-01-18 15:11) [3]

Блин,

Удалится или нет ...


 
Ломброзо   (2004-01-18 15:38) [4]

Да вот я и чувствую, что переленился...

#define BEGIN_CRITICAL_CODE()\
CRITICAL_SECTION CS;\
InitializeCriticalSection(&CS);\
EnterCriticalSection(&CS);

#define END_CRITICAL_CODE()\
LeaveCriticalSection(&CS);\
DeleteCriticalSection(&CS);

т.е. пишу на С и завернул вызовы в макросы, которые и вставляю в начало тела функции и в конец. Беда в том, что методы класса TMyClass, код которого является критическим, внутри себя не должен использовать try..finally, т.е. ексепшны кидаемые экземплярами класса TMyClass должны ловить те классы, которые от него наследуются или его используют.

Чего-то я просто торможу... Мне просто нужно:
1) при возникновении исключения в одном из методов TMyClass корректно завершить работу с критическими секциями
2) пойманный в одном из методов TMyClass ексепшн возбудить снова.


 
Тимохов   (2004-01-18 15:46) [5]

finally не ловит исключений - все что внутри них возбудилось пойдет выше до ближайшей секции try except. В данном случае finally гарантирует корректное закрытие ресурсов.


 
Ломброзо   (2004-01-18 15:48) [6]

Тьху ведь и в самом деле не ловит...
спасибо, тормозить закончил )


 
Тимохов   (2004-01-18 15:52) [7]

Меняйте тормозную жидкость каждые два года или каждые 30 тыс. км. - иначе словите паровую пробку.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
14-93633
Курящий
2004-01-08 17:30
2004.01.29
Курящим


14-93692
anana][
2004-01-06 15:32
2004.01.29
Когда-то я спрашивал, как можно добавить юзера...


14-93681
Knight
2004-01-06 21:18
2004.01.29
А что в mpeg-ах?


1-93470
Andin Gor
2004-01-15 21:08
2004.01.29
text


3-93349
Jane
2004-01-02 18:23
2004.01.29
В DBGrid не отображается знаечние поля.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский