![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread + CreateOleObject какой-то странный глюк. [D7, Win2k, WinXP]
DNSokol © (2004-02-07 13:31:00)Привет всем.
Решил вынести особо грамоздкие процедуры общения с БД и вывода результатов в триды. И столкнулся с такой бякой:
Создаю трид:
ThreadLink := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
процесс пошёл на выплнение, все вроде бы ок, запросики побежали, ответы посыпались, однако при натыкании на строчку вида
ThreadLink := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
вываливаемя с ошибкой: EOleSysError with message 'Не был произведён вызов CoInicialize()'
Вот собственно и интересно, где грабли, т.к. если пулять это всё дело в потоке основного приложения (без создания отдельного потока путём CreateThread) - всё ок.
Polevi (2004-02-08 13:37:00) [1]просто грохает
DNSokol (2004-02-07 21:02:00) [2]сам разобрался :) теперь не ругается. Осталься вопрос о корректности. Убиваю при помощи TerminateThread. Однако в процессе есть созданные объекты, у которых есть свои диструкторы. ВОт интересно - она их юзает - или просто грохает процесс вместе со всей занятой под него памятью?
DNSokol (2004-02-07 19:33:00) [3]To DigitMan:
понятненько :) пасиб огромный.
И ещё маленький вопросик - когда имеются "форс-мажорные" обстоятельства, как правильнее убить созданный процесс? когда он доходит до своего логического конца и умирает (ессно с очисткой handle), то всё ок. а как его тормознуть в момент выполнения. Я торможу путём варварского киляния, вследстви чего винды сильно возмущаются по поводу некорректного убиения.
Digitman (2004-02-07 17:20:00) [4]
> Почему в контексте основного приложения вызывать CoInitialize
>
в контексте не "основного приложения", а "основного кодового потока процесса"
объяснение "феномена" проще пареной репы : вызов этой ф-ции в осн.код.потоке происходит автоматически (об этом позаботился Борланд), а аналогичные вызовы в каждом новом доп.код.потоке должен производить ты сам, если планируешь работать в нем с OLE/COM-объектами
jack128 (2004-02-07 17:16:00) [5]
> Почему в контексте основного приложения вызывать CoInitialize
> необезательно,
она автоматом вызывается. Поищи в ComObj..
DNSokol (2004-02-07 16:58:00) [6]пасиба :) помогло :) исё забегало...
только вот всё-таки любопытство грызёт - я нигде в манах, т.е. в хелпе не нашел описание такой фишки. Почему в контексте основного приложения вызывать CoInitialize необезательно, а вот если процедурку запихать в трид, то приходится в ручныю стартовать.
Digitman (2004-02-07 14:30:00) [7]uses ActiveX
DNSokol (2004-02-07 14:08:00) [8]CoInitialize - откудова взять? если просто так написать, то компилер ругается - типа нету такого.
Digitman (2004-02-07 13:41:00) [9]function ThreadFunc(...): DWORD; stdcall;
begin
try
CoInitialize(nil);
try
ExcelApplication := CreateOleObject(..);
try
... работа с ExcelApplication
finally
ExcelApplication := Null; // или nil, смотря что у тебя там
Result := ...;
end;
finally
CoUnInitialize;
end;
except
Result := ...;
end;
end;
DNSokol (2004-02-07 13:34:00) [10]ой... ошибочка вкралась :( после слов натыкании на строчку видадолжно быть:
ExcelApplication := CreateOleObject(cls_ExcelObject) :) и уже с ошибкой на ней копытимся