Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова потоки / 25 сообщений из 26, страница 1 из 2
05.03.2018, 17:09
    #39610772
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
Всем доброго дня!
Есть простой поток
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  TSimpleThread = class(TThread)
.
.
.
procedure TSimpleThread.Execute;
var i, s : integer;
begin
  for i := 0 to 5 do
    s := i;
end;



и есть его вызов из главной формы
Код: pascal
1.
2.
3.
  SimpleT := TSimpleThread.Create;
  SimpleT.FreeOnTerminate := True;
  SimpleT.Priority := tpLower;



Разве после выполнения, поток не должен уничтожиться и переменная SimpleT не должна стать Nil?
Assigned(SimpleT) дает не nil
...
Рейтинг: 0 / 0
05.03.2018, 17:18
    #39610782
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchikпеременная SimpleT не должна стать Nil?нет, разумеется. у тебя переменная S в теле потока после того, как станет не нужна, становится равна нулю сама?))
...
Рейтинг: 0 / 0
05.03.2018, 17:24
    #39610789
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchikРазве после выполнения, поток не должен уничтожиться и переменная SimpleT не должна стать Nil?
1. Должен.
2. Нет, это по факту указатель на участок памяти. Сам по себе не умеет обнуляться.
...
Рейтинг: 0 / 0
05.03.2018, 17:24
    #39610790
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchik,

в программировании ничто не происходит 'чудесным образом'. если ты сам не обнилишь SimpleT, то кто же сделает это за тебя?
...
Рейтинг: 0 / 0
05.03.2018, 17:26
    #39610792
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchik,
Код: pascal
1.
2.
3.
4.
5.
6.
SimpleT.FreeOnTerminate := True;
SimpleT2 := SimpleT; 
SimpleT3 := SimpleT; 
SimpleT4 := SimpleT; 
MySuperThread := SimpleT; 
SimpleT := nil; // по желанию



Наводящий вопрос: должны ли стать nil переменные SimpleT2, SimpleT3, SimpleT4 и MySuperThread?

Если да, то где хранится список переменных, в которые нужно записать nil?
...
Рейтинг: 0 / 0
05.03.2018, 17:27
    #39610795
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchik, даже лучше такой вопрос: создаст ли новый поток указанный ниже код?

Код: pascal
1.
SimpleT2 := SimpleT;
...
Рейтинг: 0 / 0
05.03.2018, 18:02
    #39610828
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchikAssigned(SimpleT) дает не nil
вот это самое первое неприятное открытие, когда начинаешь работать с доп.потоками, начитавшись мануалов :) Поэтому, лучше заворачивай создание потока в try..finally

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
try
  SimpleT := TSimpleThread.Create;
  SimpleT.FreeOnTerminate := True;

  SimpleT.Priority := tpLower;
finally
  if Assigned(SimpleT) then SimpleT:= nil; //FreeAndNil(SimpleT), если SimpleT.FreeOnTerminate = False
end;
...
Рейтинг: 0 / 0
05.03.2018, 18:09
    #39610833
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
DimonkaТогда уж

Из-за особенностей реализации FreeOnTerminate это совершенно всё равно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.03.2018, 18:10
    #39610837
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
ДокПоэтому, лучше заворачивай создание потока в try..finally
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
try
  SimpleT := TSimpleThread.Create;
  SimpleT.FreeOnTerminate := True;

  SimpleT.Priority := tpLower;
finally
  if Assigned(SimpleT) then SimpleT:= nil; //FreeAndNil(SimpleT), если SimpleT.FreeOnTerminate = False
end;


А что это даст? Тогда уж
Код: pascal
1.
2.
3.
4.
5.
  SimpleT := TSimpleThread.Create(true);
  SimpleT.FreeOnTerminate := True;
  SimpleT.Priority := tpLower;
  SimpleT.Resume;
  SimpleT := nil;
...
Рейтинг: 0 / 0
05.03.2018, 18:20
    #39610844
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
DimonkaА что это даст? Тогда уж
Код: pascal
1.
2.
3.
4.
5.
  SimpleT := TSimpleThread.Create(true);
  SimpleT.FreeOnTerminate := True;
  SimpleT.Priority := tpLower;
  SimpleT.Resume;
  SimpleT := nil;


Тогда уж
Код: pascal
1.
2.
3.
4.
5.
  with TSimpleThread.Create( True ) do begin
    FreeOnTerminate := True;
    Priority := tpLower;
    Resume;
  end;
...
Рейтинг: 0 / 0
05.03.2018, 18:21
    #39610845
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
Так точно не будет вопросов с переменной SimpleT :)
...
Рейтинг: 0 / 0
05.03.2018, 18:39
    #39610856
kep-ko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
GunSmoker, такие вопросы задаёшь ... ))

aidynchik, если сильно надо, можно так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TMainForma.OnTerminate(Sender: TObject);
begin
  SimpleT := nil;
end;



  SimpleT := TSimpleThread.Create(True);
  try
    SimpleT.Priority := tpLower;  
    SimpleT.FreeOnTerminate := True;
    SimpleT.OnTerminate := OnTerminate;  
    SimpleT.Start;
  except 
    // Гипс снимают, клиент уезжает!
  end;

но это не избавит от необходимости разобратся в устройстве TThread.
...
Рейтинг: 0 / 0
05.03.2018, 19:20
    #39610870
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchikРазве после выполнения, поток не должен уничтожиться и переменная SimpleT не должна стать Nil?

TThread наследник от TObject, со всеми вытекающими.
...
Рейтинг: 0 / 0
05.03.2018, 19:23
    #39610871
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
И кстати, почему некоторые ждут, что после Free ссылка на объект должна сама занулиться? На каком ЯП они программировали/учились программировать раньше? Мне интересно посмотреть на этот ЯП.
...
Рейтинг: 0 / 0
05.03.2018, 19:27
    #39610874
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
stanilar,

Delphi NextGen/LLVM ?
...
Рейтинг: 0 / 0
05.03.2018, 19:28
    #39610875
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
stanilarссылка на объект

они не понимают, что такое ссылка

они понимают, что это объект и есть, как строка и т.д.
...
Рейтинг: 0 / 0
05.03.2018, 20:26
    #39610883
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
Arioch, таки, строка - тоже ссылка
...
Рейтинг: 0 / 0
05.03.2018, 21:31
    #39610898
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
fd00ch,

Ну да, в делфи всё - ссылки, кроме статических структур и статических же массивов.
...
Рейтинг: 0 / 0
05.03.2018, 23:06
    #39610909
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
DimonkaА что это даст? Тогда уж
не по феншую
...
Рейтинг: 0 / 0
05.03.2018, 23:08
    #39610911
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
Щас обсуждение выльется во что-то, подобное этому
...
Рейтинг: 0 / 0
05.03.2018, 23:10
    #39610913
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
Докне по феншуюПо мне, так
Код: pascal
1.
FreeOnTerminate := True;

уже не по феншую.
...
Рейтинг: 0 / 0
06.03.2018, 01:49
    #39610937
LoneFast
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
Об чём спор-то, господа?)

aidynchikРазве после выполнения, поток не должен уничтожиться?Он и "должен" и "уничтожился" (если поток правда завершился) .
aidynchikи переменная SimpleT не должна стать Nil?Не должна. Это простой типизированный указатель. Сам не меняется.
aidynchikAssigned(SimpleT) дает не nilПотому что указатель указывает на "теперь уже мусор".
А так как память при освобождении не обнуляется - может даже что-то из полей остаться там лежать, создавая иллюзию что там до сих пор данные, но фактически это мусор.
...
Рейтинг: 0 / 0
06.03.2018, 05:28
    #39610956
aidynchik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
ого, за ночь сколько всего произошло :)
всем спасибо, этот форум реально the best
...
Рейтинг: 0 / 0
06.03.2018, 13:17
    #39611172
Олег Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
aidynchikРазве после выполнения, поток не должен уничтожиться и переменная SimpleT не должна стать Nil?
Assigned(SimpleT) дает не nil
При таком раскладе - не должен. Уничтожение потока и обниливание переменной это разные вещи.
Если нужно обнилить переменную по завершению потока, то
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
constructor TSimpleThread.Create(const AOnTerminateNotify: TNotifyEvent) ;
begin
  FreeOnTerminate := True;
  OnTerminate := AOnTerminateNotify;
  inherited Create(false);
end;
....
SimpleT := TSimpleThread.Create(OnSimpleTerminated);
...
procedure TForm.OnSimpleTerminated(Sender : TObject);
begin
  SimpleT := nil;
end;
...
Рейтинг: 0 / 0
06.03.2018, 14:57
    #39611251
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
И снова потоки
fd00ch,

как и динмассив и интерфейс/лямбда

....но очень тщательно засахаренный

var a: array of byte;

a := nil;

if a = nil then // кажется раньше работало, но не уверен
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова потоки / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]