![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Xe7 и Thread
AntonArm © (2014-10-10 18:18:00)подскажите, создаю пустой поток с FreeOnTerminate := true;
MyThread:= TMyThread.Create(false);
поток отработал.
проверяю Assignet(MyThread) даёт True.
добавил публичную процедурку ShowData:
procedure TMyThread.DoWork;
begin
ShowMessage('я живой!');
end;
procedure TMyThread.ShowData;
begin
Synchronize(DoWork);
end;
после отработки потока вызываю myThread.ShowData - работает.
проверил на Delphi2007 - ошибка, поток видать реально уничтожается после завершения.
не могли бы проверить, может я что-то путаю?
Дмитрий Белькевич (2014-10-22 01:26:00) [1]>Лично я вообще не одобряю данный флаг
нормально. если уметь готовить. с потоками вообще нужно уметь готовить. если умеешь - нормально. если не умеешь - то и без FreeOnTerminate глюков не оберешься.
Дмитрий Белькевич (2014-10-22 01:24:00) [2]>Assignet(MyThread) даёт True.
местами делаю так:
procedure TDataModule3.OnBackupTerminate(Sender: TObject);
begin
FDBBackupThread := nil;
end;
Германн (2014-10-13 02:07:00) [3]
> Потоки это такая вещь, которую лучше не создавать ...
> без надобности.
Вот с этим я абсолютно согласен! Добавил бы ещё и без понимания как это всё работает.
DVM (2014-10-12 20:19:00) [4]
> почему отрабатывает процедура, разрушенного объекта..
Зачем вообще обращать к разрушенным объектам? Ты что не знаешь какие у тебя живые какие нет? Зачем тогда вообще стал использовать FreeOnTerminate? Постоянно вижу неправильно применение этого флага, которое ничего кроме глюков не привносит в программу. Ну хоть бы завел что-ли какой список потоков и по факту уничтожения удалял потоки оттуда. Тогда будешь точно знать, кто у тебя жив, а кто мертв. Или не используй FreeOnTerminate. Лично я вообще не одобряю данный флаг. Потоки это такая вещь, которую лучше не создавать и не уничтожать без надобности. Лучше держать всегда пул рабочих потоков, которые должны оперировать заданиями - нет заданий, спим, есть задания - работаем. И никакой магии с разрушением.
Object (2014-10-11 16:32:00) [5]> AntonArm (10.10.14 23:16) [14]
> почему отрабатывает процедура, разрушенного объекта..
Потому что ShowData не обращается к полям этого объекта.
Объект уничтожен - это значит, что обращение к нему самому и к его полям стало невалидным (хотя, как тут уже говорилось, какое то время такое обращение может давать и верные результаты, но валидным от этого не становится).
Но ведь код-то никуда не делся - так чего бы ему не работать, если он к этой невалидной информации не обращается?
Германн (2014-10-11 01:46:00) [6]
> Rouse_ © (11.10.14 00:05) [22]
>
> Ну чтоб еще и с vmt повезло :) Везунчик, тогда бронебойный
> вариант, обьяви еще и переменную внутри класса, а внутри
> виртуального метода отображай ее значение
Может я что не понимаю. Почему "бронебойный" сей вариант?
И при чём тут особо vmt?
Rouse_ (2014-10-11 00:20:00) [7]Бывает, обращайся ;)
AntonArm (2014-10-11 00:08:00) [8]спасибо всем большое.
я даже рад, что здесь ступил.
Rouse_ (2014-10-11 00:05:00) [9]Ну чтоб еще и с vmt повезло :) Везунчик, тогда бронебойный вариант, обьяви еще и переменную внутри класса, а внутри виртуального метода отображай ее значение
Германн (2014-10-11 00:03:00) [10]
> ничего не увидел - то же самое.. всё отрабатывает..
Так карты сегодня легли Тройка, семерка, туз. Завтра будет тройка, семерка, дама. Можешь мне верить - я это знаю точно. :)
AntonArm (2014-10-10 23:57:00) [11]>> задекларируй данную прцедуру виртуальной, а там сам увидишь
ничего не увидел - то же самое.. всё отрабатывает..
AntonArm (2014-10-10 23:48:00) [12]Rouse_ ©, мне мысль ваша понятна..
я кстати так и пробывал: выделял большой кусок памяти, очищал обнулением..
вероятно мне не удалось затереть эту память.
Rouse_ (2014-10-10 23:38:00) [13]Зы: дурной прмер сказал, самое простое, задекларируй данную прцедуру виртуальной, а там сам увидишь
Rouse_ (2014-10-10 23:32:00) [14]Чтоб было более понятно, вынеси вызов ShowData чуть ниже по коду, и перед ним еще поработай с памятью, да хотяб еще раз создай десяток левых объектов
Rouse_ (2014-10-10 23:28:00) [15]Оно не работает в обоих случаях, но в одном из них тебе просто повезло.
AntonArm (2014-10-10 23:20:00) [16]в Xe7 и такой код работает:
TMyObject = class(TObject)
public
procedure ShowData;
end;
procedure TMyObject.ShowData;
begin
ShowMessage(timeToStr(time));
end;
..
MyObject:= TMyObject.Create;
MyObject.ShowData;
MyObject.Free;
MyObject.ShowData; // работает!
ну не должно же ведь?!
AntonArm (2014-10-10 23:16:00) [17]Rouse_ ©,
простите, а что там такого увидели в [9] ?
>> так писать нельзя
это я понимаю. я пытаюсь понять, почему отрабатывает процедура, разрушенного объекта..
Rouse_ (2014-10-10 23:05:00) [18]С учетом [9] думаю смысл диспута исчерпан :)
Rouse_ (2014-10-10 23:02:00) [19]Точно, что именно? Что мы работаем с разрушеным обьектом или что так писать нельзя? :)
AntonArm (2014-10-10 22:52:00) [20]Игорь Шевченко ©,
>> Потому что это обычная процедура и выполняется она в контексте того потока, откуда ее вызвали
почему тогда в Delphi2007 эта обычная процедура не отрабатывается а в access вываливается?