Текущий архив: 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.47 MB
Время: 0.008 c