Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.032 c
14-1080213221
Виктор
2004-03-25 14:13
2004.04.18
Как SQL - запросом в Firebird-е получить


1-1080470536
TGrey
2004-03-28 14:42
2004.04.18
К какому языку принадлежит текст


1-1080397559
TGrigory
2004-03-27 17:25
2004.04.18
Как сделать приподнимающуюся кнопку при наведении на нее мышой


1-1080811102
Mig
2004-04-01 13:18
2004.04.18
Активация уже запущенной копии приложения при запуске новой копии


3-1079574205
Sliski Slimak
2004-03-18 04:43
2004.04.18
Как избавиться от сортировки?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский