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

Вниз

Истчо один баг в Делфи?   Найти похожие ветки 

 
Aleksandr ©   (2003-02-20 11:49) [0]

У меня некоторые потоки при уничтожении подвешивались. Начал трассировать такие потоки, вышел на код в Classes:

destructor TThread.Destroy;
begin
if (FThreadID <> 0) and not FFinished then
begin
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
end;
{$IFDEF MSWINDOWS}
if FHandle <> 0 then CloseHandle(FHandle);
{$ENDIF}
{$IFDEF LINUX}
// This final check is to ensure that even if the thread was never waited on
// its resources will be freed.
if FThreadID <> 0 then pthread_detach(FThreadID);
sem_destroy(FCreateSuspendedSem);
{$ENDIF}
inherited Destroy;
FFatalException.Free; //вот про эту строчку я сообщаю
RemoveThread;


Так вот, подвисающие потоки в указанной строчке FFatalException имеют nil. Отсюда и вывес. Объясните мне, это баг Делфи или этот FFatalException всегда должен иметь значение, что Борланд так уверен в его уничтожении? Я что-то не нашел его обязательной инициализации...


 
Smashich ©   (2003-02-20 11:51) [1]

из той же VCL....

procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;


 
Anatoly Podgoretsky ©   (2003-02-20 11:55) [2]

Баг не там.


 
Aleksandr ©   (2003-02-20 12:00) [3]

2 Smashich:

При чем тут метод TObject? Обращение к методу/свойству уничтоженного/несуществующего объекта само по себе вызывает ошибку доступа.


 
Smithson ©   (2003-02-20 12:05) [4]

Нет, не вызывает. Ты путаешь методв и поля объекта. Обращение к полям несуществующего объекта вызывает ошибку. Обращение к методам - только если внутри этих методов есть обращения к полям или параметру Self без котнроля.
Для примера, выполни следующий код:
TObject(nil).Free
PS За пример не бить, но так ему мозги прочистит!


 
Игорь Шевченко ©   (2003-02-20 12:06) [5]

Aleksandr © (20.02.03 12:00)

> При чем тут метод TObject? Обращение к методу/свойству уничтоженного/несуществующего
> объекта само по себе вызывает ошибку доступа.


Где такая трава растет ?


 
Dms   (2003-02-20 12:08) [6]

Почему ? Твои методы - простые процедуры, которые никуда не деваются из памяти при уничтожении объекта.


 
Aleksandr ©   (2003-02-20 12:10) [7]

Понял. Тогда какого икса на этом пункте у меня выскакивание из метода происходит?


 
Smashich ©   (2003-02-20 12:10) [8]

2 Aleksandr ©

интересно а в чем по твоему смылс метода Free? пачему не Destroy вызывать? не думал никогда об этом?


 
Smashich ©   (2003-02-20 12:11) [9]

икс надо в другом месте искать! в коде процесса над полагать


 
Aleksandr ©   (2003-02-20 12:17) [10]

Хорошо, с объяснением метода понял. Тогда поставлю вопрос иначе: от чего может зависеть то, что компилятор при трассировки показывает исключительную ситуацию на этой строчке, а не на той, на которой (вероятно), есть ошибка? Метод Inherited Destroy у моих подвисающих потоков вызывается в дестракторе последним. По F7 я выхожу в указанный код, трассирую до данного пункта, после чего на RemoveThread он уже не выходит.


 
Smashich ©   (2003-02-20 12:28) [11]

без кода я навряд ли могу предположить чего нить


 
Dms   (2003-02-20 13:21) [12]

При работе с потоками такие глюки вылазять только в путь ... Надо код смотреть.



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
9-5374
greenrul
2002-09-26 19:03
2003.03.03
Столкновения


1-5629
Кирилл
2003-02-20 11:58
2003.03.03
как работать с ShowMessage ?


14-5810
{{{KOTOS}}}
2003-02-12 13:40
2003.03.03
Почему не находит?


1-5600
dron655
2003-02-19 18:49
2003.03.03
Графика


1-5579
Manulo
2003-02-19 17:34
2003.03.03
Глюки CheckBox-а???