Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Xe7 и Thread


Страницы:   1 2

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 вываливается?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо