Главная страница
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.105 c
15-1157716569
Руслан
2006-09-08 15:56
2006.10.01
Запуск *.bat - файла с помощью планировщика


15-1158043857
Шмель
2006-09-12 10:50
2006.10.01
Какими средствами бороться с похмельем!!??


2-1157712853
v_o_v_a
2006-09-08 14:54
2006.10.01
класс TStringList


3-1154110257
Игорь__
2006-07-28 22:10
2006.10.01
Paradox: проблема с фильтрацией.


2-1157870054
F1rst
2006-09-10 10:34
2006.10.01
Вопрос по clipboard???