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

Вниз

Чем вызвана ошибка Thread Creation error: No enought storage ...   Найти похожие ветки 

 
Aleksandr   (2002-07-09 12:58) [0]

Я предполагаю, что ошибка связана с Coinitialize.
Суть такова:
Есть базовый поток, в котором вызывается Coinitialize(nil) при создании и Couninitialize в дестракторе. Вызываются эти функции, потому что в потомках этого потока (разных, иногда существующих в нескольких экземплярах каждый) используются TADOQuery (в базовом его нет). И по истечении какого-то периода работы программа начинает выдавать указанную ошибку. Может, причина в том, что Coinitialize следует вызывать только в самих потомках?


 
Digitman   (2002-07-09 13:05) [1]

"при создании" - надо понимать "в теле конструктора" ?
Этио неверно. Конструктор вызвается другим потоком, а не тем, что собственно создается и в котором планируется обращение к OLE/COM


 
Aleksandr   (2002-07-09 13:14) [2]

Так, не понял, что неверно. При создании - да, в теле констрактора. То есть у базового потока:

constructor TShowProgressThread.Create;
begin
Inherited Create(true);
Coinitialize(nil);
DoSomething
end;

destructor TShowProgressThread.Destroy;
begin
DoSomething;
Couninitialize;
Inherited
end;

у потомков:

constructor TQueryThread.Create;
begin
Inherited Create;
FQuery:=TblList.GetADOQuery;
DoSomething
end;


 
Digitman   (2002-07-09 13:21) [3]

вот это

procedure TSomeThread.Execute;
begin
Coinitialize(nil);
try
finally
Couninitialize;
end;
end;

верно.

Все остальное (что ты привел) - нет.


 
Aleksandr   (2002-07-09 13:25) [4]

Оппа... SomeThread, соответственно - потомок, коли Execute у всех перекрывается? А почему так? И еще вопрос, если можно - в программе есть список - потомок TList, потокам не принадлежащий, который создает эти самые TADOQuery для потоков по их вызовам. В нем Coinitialize не нужна?


 
Aleksandr   (2002-07-09 13:30) [5]

Просто у меня глобальная проблема в организации программы предыдущим автором. Он в базовом потоке закрывал Execute, делая его выполнение следующим образом:

procedure TShowProgressThread.Execute;
begin
DoSomething;
DoExecute;
DoSomething
end;

и в потомках уже перекрывался DoExecute... Поэтому execute мне недоступен.


 
Digitman   (2002-07-09 13:56) [6]

И правильно делал "предыдущий автор") ... Coinitialize/CoUninitialize() нужно вызывать ТОЛЬКО в переопределенном вирт.методе TThread.Execute



 
Aleksandr   (2002-07-09 14:29) [7]

Ничего не понимаю... Так где мне вызывать Coinitialize - у базового потомка TShowProgressThread или полностью перекрывать его Execute в его потомках и вызывать в них? :(


 
Aleksandr   (2002-07-09 14:36) [8]

Или вообще мона сделать так:

procedure TQueryThread.DoExecute;
begin
Coinitialize(nil);
try
DoSomething;
finally
Couninitialize
end
end;


Execute у него по-прежнему отсутствует, вместо него базовый:

procedure TShowProgressThread.Execute;
begin
DoSomething;
DoExecute;
DoSomething
end;


 
Digitman   (2002-07-09 14:42) [9]

если
TShowProgressThread.DoExecute; virtual; abstract;

а

TQueryThread.DoExecute; override;

то

procedure TQueryThread.DoExecute;
begin
Coinitialize(nil);
try
DoSomething;
finally
Couninitialize
end
end;


 
Aleksandr   (2002-07-09 15:32) [10]

Большое спасибо! Только базовый DoExecute не abstract, а просто virtual - когда она писалась, такого еще не было. А потомок - override. Надеюсь, это не повлияет?


 
Digitman   (2002-07-09 15:59) [11]

Нет, не повлияет



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

Форум: "Основная";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.004 c
1-70677
xyz
2002-07-05 16:54
2002.07.22
кодировки((( koir-8 win


7-70931
ask
2002-04-30 14:26
2002.07.22
код клавиши Tab


6-70847
Alibaba
2002-05-14 17:15
2002.07.22
TserverSocket


6-70848
Фантом
2002-05-11 10:56
2002.07.22
Преобразование IP


14-70924
Ежик
2002-06-26 12:09
2002.07.22
Как скрыть свойства обозревателя в Internet Explorere?





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