Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 и не касается доп. потоков.


Наверх

Титульная страница Поиск, карта сайта Написать письмо