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

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

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) :) и уже с ошибкой на ней копытимся


Наверх

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