![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CoUnInitialize() [D7, WinXP]
Sam Stone © (2006-08-23 18:08:00)Всем доброго времени суток :)
ADO компоненты работают в отдельном потоке. Для корректной работы выполняется CoInitialize. А чем грозит невыполнение CoUnInitialize в конце процедуры, работающей в потоке?
Щас еще наткнулся на совет установить CoInitFlags := COINIT_MULTITHREADED. Если так сделать необходимость вызывать CoInitialize отпадет?
Ketmar (2006-08-23 20:52:00) [1]> [9] Sam Stone © (23.08.06 20:45)
а чего бы ему не сработать? я на это и намекал, собственно. для того finally сделано -- чтобы в любомслучае отрабатывать.
Sam Stone (2006-08-23 20:45:00) [2]удивил код:
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
Счас тогда оберну таким образом. Спасибо.
guav (2006-08-23 20:31:00) [3]не изменяя существующего кода добавить try после CoInitialize finally перед CoUnInitialize и end после CoUnInitialize. Какие тут проблемы ?
Sam Stone (2006-08-23 20:12:00) [4]
> Ketmar © (23.08.06 19:52) [6]
в лог пишется всякая ерунда
except
on e:exception do
AddToLog("при обращении/подключении/обработки того/сего/пятого/десятого туда/сюда произошла ошибка:" +e.message);
end;
что существенно облегчает дебаг. Ну и просто ход работы нужен "для отчетности" :)
Собсно, если в [2] полный ответ, то все ясно. Если с finally можно аналогично получать текст сообщения об ошибке, то напишите как. Если нет возможности -то дальше можно не обсуждать при условии полного ответа в [2] (т.е. если эксепшны не посыпятся после сотни-другой вызовов процедуры).
Ketmar (2006-08-23 19:52:00) [5]> [5] Sam Stone © (23.08.06 19:49)
не понял. зачем перепахивать? при чём тут exception к finally?
Sam Stone (2006-08-23 19:49:00) [6]
> Ketmar © (23.08.06 19:31) [4]
Тоже вариант, но придется сильно перепахивать код лога программы. А получится в finally достать сообщение exception.message?
К тому же сообщения об ошибках не однотипные: ошибки доступа, преобразования данных, еще что-нибудь...
Ketmar (2006-08-23 19:31:00) [7]а кто мешает всю процедуру "обернуть" в try ... finally?
Sam Stone (2006-08-23 19:09:00) [8]
> а в чем проблема одну строчку написать ?
В процедуре используется Exit, если произошла критичная для продолжения работы ошибка. Понимаю, что лучше добавить IfThenElse'ов, но сейчас немного не до этого, да и exit пользуется только в try except.
Например:
begin
CoInitialize(nil);
...
try
код, кот. может вызвать эксепшн
except
обработка
//Вот тут получается тоже надо CoUnInitialize делать
exit;
end;
...
еще немного кода
...
CoUnInitialize;
end;
Ну и этих try except'ов может быть несколько.
jack128 (2006-08-23 19:00:00) [9]Sam Stone © (23.08.06 18:08)
А чем грозит невыполнение CoUnInitialize в конце процедуры, работающей в потоке?
утечкой ресурсов, очевидно ;-)
а в чем проблема одну строчку написать ?
guav (2006-08-23 18:19:00) [10]> CoInitFlags
Это используется при вызове CoInitialize[Ex] в ComObj из Application.Initialize и не касается доп. потоков.