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

Вниз

Ошибка в деструкторе TThread?   Найти похожие ветки 

 
Erik1   (2004-08-31 15:14) [0]

Если происходит исключение внутри конструктора TThread, то при вызове TThread.WaitFor в нем происходит ошибка "EExternalException in module ntdll.dll at 0001FFE4 External exception C0000008".  Что тут можно сделать? Причем вылетает это на вызове "while MsgWaitForMultipleObjects(1, H, False, INFINITE,
QS_SENDMESSAGE) = WAIT_OBJECT_0 + 1 do PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE)"


 
TUser ©   (2004-08-31 15:17) [1]

Во-первых где происходит ошибка - в конструкторе или в деструкторе. Если последнее - то зачем ты вызываешь WaitFor?


 
KSergey ©   (2004-08-31 15:18) [2]

Что-то я не понял: в кострукторе исключение, т.е. объект не создался. О вызове каких других методов данного экземпляра (которого и нет вовсе!) можно говорить-то?


 
Erik1   (2004-08-31 15:22) [3]

Вы забыли, что если в конструкторе происходит исключение то автоматически вызывается деструктор. А вот в деструкторе TThread и начинабтся проблемы. По моему ясно что TThread это не мой класс и если там вызывается WaitFor значит это нужно.


 
VMcL ©   (2004-08-31 15:24) [4]

>>KSergey ©  (31.08.04 15:18) [2]

>Что-то я не понял: в кострукторе исключение, т.е. объект не создался.

Создался. Просто не(до)инициализорован.


 
KSergey ©   (2004-08-31 15:28) [5]

> [4] VMcL ©   (31.08.04 15:24)
> >Что-то я не понял: в кострукторе исключение, т.е. объект
> не создался.
>
> Создался. Просто не(до)инициализорован.

Внутри конструктора - хорошо, согласен. Хотя все равно на неудачной операции вылетим - т.е. операции, работающие с недоинициилизированными данными просто не будут выполняться

Однако c точки зрения кода за пределами конструктора - экземпляр именно не создасться!

Однако, автор про стандартный деструктор TThread что-то гутарит.. Не силен я, конечно, но сомнения меня как-то разбирают в части наличия там проблем.. Хотя - как знать, конечно


 
Суслик ©   (2004-08-31 15:37) [6]


> Вы забыли, что если в конструкторе происходит исключение
> то автоматически вызывается деструктор

в доке под конструтору tobject явным текстом высказано предупреждение, что указанный тобой факт нужно принимать во внимание и проводить деинициализацию учитывая, что объект может быть не полностью инициализирован. Твое дело аккуратно все проанализировать и написать.


 
KSergey ©   (2004-08-31 15:39) [7]

> [5] KSergey ©   (31.08.04 15:28)
> недоинициилизированными данными просто не будут выполняться

С учетом поправки

>  [6] Суслик ©   (31.08.04 15:37)

уточню, что имелось в виду конечно

недоинициилизированными данными просто не будут выполнятьсяв конструкторе.

Ясно, что в деструкторе это надо учесть


 
Erik1   (2004-08-31 15:47) [8]

Разумеется я все учел, мой деструктор выполняется без сучка и задоренки. А вот когда я делаю inherited и вызывается родной деструктор TThread, тогда и начинаются проблемы. Я же писал, что это немая ошибка. Пока перодолел проблему так:
В конструкторе опустил inherited Create ниже.
Var UDPServer: TIdUDPServer;
begin
 UDPServer := TIdUDPServer.Create(nil);
 with IdUDPServer do begin
 ................
   Active := True;
 end;
 inherited Create(LogFile, 5000);
 IdUDPServer := UDPServer; //присваеваем полю класса
Но всеравно обидно.


 
KSergey ©   (2004-08-31 16:08) [9]

> [8] Erik1   (31.08.04 15:47)
>  inherited Create(LogFile, 5000);

И вы будете утверждать, что это вызов конструктора TThread???
К стати, есть еще такой момент. Надо не забывать, что при вызове конструктора TThread с параметром  False сразу создает объект виндовс "поток", код котрого начинает выполняться! (т.е. код из Execute)
И если там используются какие-то данные, инициализируемые в конструкторе, но ниже inherited - то сами понимаете...

> В конструкторе опустил inherited Create ниже.

Законно


 
Erik1   (2004-08-31 16:45) [10]

Ну у меня дилнное наследование, если нитересно то
TRealEvent = class(TLogThread)
TLogThread = class(TCustomThread)
TCustomThread = class(TThread)
В конечном итоге вызывается Constructor TThread.
У меня в кострукторе TCustomThread вконце стоял resume, попробовал убрать и возвратить старый код. Вроде получше стало, но доконца непомогло. Оставил вариант с вызовом inherited Create в конце конструктора.


 
KSergey ©   (2004-08-31 18:57) [11]

> Erik1   (31.08.04 16:45) [10]
> Ну у меня дилнное наследование, если нитересно то

Все же еще раз спрошу: вы до сих пор уверены, что

> Erik1   (31.08.04 15:47) [8]
> А вот когда я делаю inherited и вызывается
> родной деструктор TThread, тогда и начинаются проблемы.

??
Вот я все же сиильно сомневаюсь.


 
Erik1   (2004-09-01 10:10) [12]

Полностью уверен, у меня создается и уничтожатся пара event еще чегото по мелочи. Я даже скомпилил с Debug DCU и проверил в отладчике. В принципе надобы в подводные камни отправить на королевство.


 
KSergey ©   (2004-09-01 10:23) [13]

Тогда можно сюда минимальный код, на котором это проявляется? Мне тоже любопытно.


 
GrayFace ©   (2004-09-01 16:53) [14]

А если сделать class procedure Create, которая вызывает конструктор, не создавая исключений, а просто возвращая nil?


 
Суслик ©   (2004-09-01 17:32) [15]


> KSergey ©   (31.08.04 16:08) [9]
>И если там используются какие-то данные, инициализируемые в >конструкторе, но ниже inherited - то сами понимаете...


типа, не прав ты...

создается то сразу, но запускается только после отработки конструктора в aftercontruction

как минимум так в шестерке...


 
Erik1   (2004-09-02 14:34) [16]

Был дополнительный exception в нижележащем деструкторе, в результате управление передавалась верхнему деструктору, но там стояли проверки на nil и все отрабатывало нормально. А когда дело доходило до деструктора TThread то возникала ошибка на WinAPI. Вобщем код поправил и все заработало полностью коректно.



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

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

Наверх




Память: 0.51 MB
Время: 0.029 c
14-1094114473
maksim
2004-09-02 12:41
2004.09.19
удаление символов строки при нажатии кнопки


4-1092043138
Анатолий
2004-08-09 13:18
2004.09.19
Автогенерация в текущем десктопе.


3-1092924198
surkis
2004-08-19 18:03
2004.09.19
Дата в SQL


14-1094044391
Гость
2004-09-01 17:13
2004.09.19
Делаю в таймере ClientSocket.Open; через пол-часа выдает


8-1088598277
sashok
2004-06-30 16:24
2004.09.19
Координаты рисунка MediaPlayer