Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.027 c
1-1081074775
Serious Sam
2004-04-04 14:32
2004.04.18
Как сделать, чтобы приложение запускалось в определенное время?


8-1072869755
Linuxoid
2003-12-31 14:22
2004.04.18
Светомузыка


14-1080014499
Романов Р.В.
2004-03-23 07:01
2004.04.18
Опрос - Инструменты программиста


3-1080101505
Oldster
2004-03-24 07:11
2004.04.18
События в базе данных


1-1080289324
kdy
2004-03-26 11:22
2004.04.18
Как отловить событие сворачивания формы?




   Наверх