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

Вниз

Thread + CreateOleObject какой-то странный глюк.   Найти похожие ветки 

 
DNSokol ©   (2004-02-07 13:31) [0]

Привет всем.
Решил вынести особо грамоздкие процедуры общения с БД и вывода результатов в триды. И столкнулся с такой бякой:

Создаю трид:
 ThreadLink := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
процесс пошёл на выплнение, все вроде бы ок, запросики побежали, ответы посыпались, однако при натыкании на строчку вида
 ThreadLink := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
вываливаемя с ошибкой: EOleSysError with message "Не был произведён вызов CoInicialize()"
Вот собственно и интересно, где грабли, т.к. если пулять это всё дело в потоке основного приложения (без создания отдельного потока путём CreateThread) - всё ок.


 
DNSokol ©   (2004-02-07 13:34) [1]

ой... ошибочка вкралась :( после слов натыкании на строчку вида должно быть:
ExcelApplication := CreateOleObject(cls_ExcelObject) :) и уже с ошибкой на ней копытимся


 
Digitman ©   (2004-02-07 13:41) [2]

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 14:08) [3]

CoInitialize - откудова взять? если просто так написать, то компилер ругается - типа нету такого.


 
Digitman ©   (2004-02-07 14:30) [4]

uses ActiveX


 
DNSokol ©   (2004-02-07 16:58) [5]

пасиба :) помогло :) исё забегало...
только вот всё-таки любопытство грызёт - я нигде в манах, т.е. в хелпе не нашел описание такой фишки. Почему в контексте основного приложения вызывать CoInitialize необезательно, а вот если процедурку запихать в трид, то приходится в ручныю стартовать.


 
jack128 ©   (2004-02-07 17:16) [6]


> Почему в контексте основного приложения вызывать CoInitialize
> необезательно,
она автоматом вызывается. Поищи в ComObj..


 
Digitman ©   (2004-02-07 17:20) [7]


> Почему в контексте основного приложения вызывать CoInitialize
>


в контексте не "основного приложения", а "основного кодового потока процесса"

объяснение "феномена" проще пареной репы : вызов этой ф-ции в осн.код.потоке происходит автоматически (об этом позаботился Борланд), а аналогичные вызовы в каждом новом доп.код.потоке должен производить ты сам, если планируешь работать в нем с OLE/COM-объектами


 
DNSokol ©   (2004-02-07 19:33) [8]

To DigitMan:
понятненько :) пасиб огромный.
И ещё маленький вопросик - когда имеются "форс-мажорные" обстоятельства, как правильнее убить созданный процесс? когда он доходит до своего логического конца и умирает (ессно с очисткой handle), то всё ок. а как его тормознуть в момент выполнения. Я торможу путём варварского киляния, вследстви чего винды сильно возмущаются по поводу некорректного убиения.


 
DNSokol ©   (2004-02-07 21:02) [9]

сам разобрался :) теперь не ругается. Осталься вопрос о корректности. Убиваю при помощи TerminateThread. Однако в процессе есть созданные объекты, у которых есть свои диструкторы. ВОт интересно - она их юзает - или просто грохает процесс вместе со всей занятой под него памятью?


 
Polevi ©   (2004-02-08 13:37) [10]

просто грохает



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
3-1080049676
Voland777
2004-03-23 16:47
2004.04.18
Помогите заполнить image поле !!!


7-1076695062
@G
2004-02-13 20:57
2004.04.18
Перезагрузка Windows?


3-1079529989
Visnuk
2004-03-17 16:26
2004.04.18
Печать DBGrid с множественным выбором


4-1076074289
able
2004-02-06 16:31
2004.04.18
Сокеты на WinAPI


8-1072285883
SkySat
2003-12-24 20:11
2004.04.18
OpenGL