Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
2-1157697536
Grid
2006-09-08 10:38
2006.10.01
Dbgrid


2-1157878455
Calibr
2006-09-10 12:54
2006.10.01
CreatePolygonRgn


6-1147016467
Windows
2006-05-07 19:41
2006.10.01
ICQ клиент на Win API


2-1157997488
Adios
2006-09-11 21:58
2006.10.01
помогите разобраться


1-1155900190
guav
2006-08-18 15:23
2006.10.01
Разрешение и размер изображения TMetafile и Microsoft Word.