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-10 22:49:00) [21]


> А уж в контексте какой нити выполнятется указаный тобой
> вызов - вообще велосипедно, ибо ты работаешь с уже разрушеным
> объектом.


Точно ?


AntonArm   (2014-10-10 22:25:00) [22]

что бы было понятнее вот простой код:

  TMyThread = class(TThread)
  private
    myStr: String;

  protected
    procedure   DoWork;
    procedure   Execute;  override;
  public
    procedure ShowData;
  end;

...

procedure TMyThread.Execute;
begin
 myStr:= timeToStr(time);
 ShowData;
end;

procedure TMyThread.DoWork;
begin
  ShowMessage(myStr);
end;

procedure TMyThread.ShowData;
begin
  Synchronize(DoWork);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 MyThread:= TMyThread.Create(false);
 MyThread.FreeOnTerminate:= true;
 MyThread.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 MyThread.ShowData;
end;


меня смущает что отрабатывается MyThread.ShowData по второй кнопке на XE6 и 7 пустым сообщением.
в Delphi2007 получаю как и ожидаю access

как отрабатывается в Xe7 FreeOnTerminate не могу понять..


AntonArm   (2014-10-10 21:59:00) [23]

добавил в нить глобальную строковую переменную.
в execute только присваиваю ей значение.
в procedure TMyThread.DoWork;
begin
 ShowMessage(myStr);
end;

после отработки потока, вызываю MyThread.ShowData
ShowMessage отрабатывается, но выводится пустая строка.

вообще запутался что-то...


AntonArm   (2014-10-10 21:55:00) [24]

>> Советую подключить FastMM

попробывал в цикле 1000 раз создавать поток - память не течет.
но MyThread.ShowData отрабатывает после окончания работы потока.
у кого XE6 или 7  проверьте пожалуйста..


AntonArm   (2014-10-10 21:51:00) [25]

>> ибо ты работаешь с уже разрушеным объектом.

вот вот!
MyThread:= TMyThread.Create(false);
нить отрабатывает, вызывается OnTerminate.

после чего вызываю MyThread.ShowData
в Delphi2007 вываливается
в Xe7 - отрабатывет ShowMessage('я живой!');


Rouse_   (2014-10-10 21:50:00) [26]

Советую подключить FastMM (в виде сторонней библиотеки) она тебе сразу покажет что ты делаешь неправильно, особливо даст понятия по обращению к обьекту, разрушенному в сторонней нити (потоке).


Rouse_   (2014-10-10 21:44:00) [27]


> не могли бы проверить, может я что-то путаю?

Ничего ты не путаешь - просто такой вызов невалиден изначально.
А уж в контексте какой нити выполнятется указаный тобой вызов - вообще велосипедно, ибо ты работаешь с уже разрушеным объектом.


Игорь Шевченко   (2014-10-10 21:28:00) [28]


> повторный вызов MyThread.ShowData  отрабатывается.


Потому что это обычная процедура и выполняется она в контексте того потока, откуда ее вызвали, в данном случае - основного


AntonArm   (2014-10-10 21:13:00) [29]

MBo ©, да, да - я это понял.
мне просто не понятно почему после отработки потока,
повторный вызов MyThread.ShowData  отрабатывается.


MBo   (2014-10-10 20:16:00) [30]

>Assignet(MyThread)  даёт True.
объект освобождается, но переменная не обнуляется, так что проверка Assigned бесполезна.
Если нужно знать, когда поток завершился, то для извещения об этом есть событие OnTerminate.


Страницы:   1 2

Наверх

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