![]() |
| ||
|
|
Новости |
Поиск |
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-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.