Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизCoUnInitialize() Найти похожие ветки
← →
Sam Stone © (2006-08-23 18:08) [0]Всем доброго времени суток :)
ADO компоненты работают в отдельном потоке. Для корректной работы выполняется CoInitialize. А чем грозит невыполнение CoUnInitialize в конце процедуры, работающей в потоке?
Щас еще наткнулся на совет установить CoInitFlags := COINIT_MULTITHREADED. Если так сделать необходимость вызывать CoInitialize отпадет?
← →
guav © (2006-08-23 18:19) [1]> CoInitFlags
Это используется при вызове CoInitialize[Ex] в ComObj из Application.Initialize и не касается доп. потоков.
← →
jack128 © (2006-08-23 19:00) [2]Sam Stone © (23.08.06 18:08)
А чем грозит невыполнение CoUnInitialize в конце процедуры, работающей в потоке?
утечкой ресурсов, очевидно ;-)
а в чем проблема одну строчку написать ?
← →
Sam Stone © (2006-08-23 19:09) [3]
> а в чем проблема одну строчку написать ?
В процедуре используется Exit, если произошла критичная для продолжения работы ошибка. Понимаю, что лучше добавить IfThenElse"ов, но сейчас немного не до этого, да и exit пользуется только в try except.
Например:
begin
CoInitialize(nil);
...
try
код, кот. может вызвать эксепшн
except
обработка
//Вот тут получается тоже надо CoUnInitialize делать
exit;
end;
...
еще немного кода
...
CoUnInitialize;
end;
Ну и этих try except"ов может быть несколько.
← →
Ketmar © (2006-08-23 19:31) [4]а кто мешает всю процедуру "обернуть" в try ... finally?
← →
Sam Stone © (2006-08-23 19:49) [5]
> Ketmar © (23.08.06 19:31) [4]
Тоже вариант, но придется сильно перепахивать код лога программы. А получится в finally достать сообщение exception.message?
К тому же сообщения об ошибках не однотипные: ошибки доступа, преобразования данных, еще что-нибудь...
← →
Ketmar © (2006-08-23 19:52) [6]> [5] Sam Stone © (23.08.06 19:49)
не понял. зачем перепахивать? при чём тут exception к finally?
← →
Sam Stone © (2006-08-23 20:12) [7]
> Ketmar © (23.08.06 19:52) [6]
в лог пишется всякая ерунда
except
on e:exception do
AddToLog("при обращении/подключении/обработки того/сего/пятого/десятого туда/сюда произошла ошибка:" +e.message);
end;
что существенно облегчает дебаг. Ну и просто ход работы нужен "для отчетности" :)
Собсно, если в [2] полный ответ, то все ясно. Если с finally можно аналогично получать текст сообщения об ошибке, то напишите как. Если нет возможности -то дальше можно не обсуждать при условии полного ответа в [2] (т.е. если эксепшны не посыпятся после сотни-другой вызовов процедуры).
← →
guav © (2006-08-23 20:31) [8]не изменяя существующего кода добавить try после CoInitialize finally перед CoUnInitialize и end после CoUnInitialize. Какие тут проблемы ?
← →
Sam Stone © (2006-08-23 20:45) [9]удивил код:
try
strtoint("0");
try
strtoint("a");
except
on e:exception do begin
showmessage("error - "+e.Message);
exit;
end;
end;//except
finally
DoSomething;
end;
Я думал, что после exit произойдет выход из процедуры... Но брякпоинт в finally сработал о_0
Счас тогда оберну таким образом. Спасибо.
← →
Ketmar © (2006-08-23 20:52) [10]> [9] Sam Stone © (23.08.06 20:45)
а чего бы ему не сработать? я на это и намекал, собственно. для того finally сделано -- чтобы в любом случае отрабатывать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c