Главная страница
    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.47 MB
Время: 0.045 c
3-1079865966
Leonid
2004-03-21 13:46
2004.04.18
Взаимодействие InterBase с Delphi


7-1076682950
Шурик Ш
2004-02-13 17:35
2004.04.18
Забыл... Как запустить из своего приложения другой EXE-шник?


1-1080742227
В л а д и м и р
2004-03-31 18:10
2004.04.18
Иконки для быстрых кнопок


4-1076419821
Islander
2004-02-10 16:30
2004.04.18
Вставить текст из буфера в чужое приложение


11-1062823353
OnMessage
2003-09-06 08:42
2004.04.18
OnMessage в Kol





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский