powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / И снова потоки
25 сообщений из 26, страница 1 из 2
И снова потоки
    #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
И снова потоки
    #39610782
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikпеременная SimpleT не должна стать Nil?нет, разумеется. у тебя переменная S в теле потока после того, как станет не нужна, становится равна нулю сама?))
...
Рейтинг: 0 / 0
И снова потоки
    #39610789
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikРазве после выполнения, поток не должен уничтожиться и переменная SimpleT не должна стать Nil?
1. Должен.
2. Нет, это по факту указатель на участок памяти. Сам по себе не умеет обнуляться.
...
Рейтинг: 0 / 0
И снова потоки
    #39610790
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik,

в программировании ничто не происходит 'чудесным образом'. если ты сам не обнилишь SimpleT, то кто же сделает это за тебя?
...
Рейтинг: 0 / 0
И снова потоки
    #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
И снова потоки
    #39610795
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik, даже лучше такой вопрос: создаст ли новый поток указанный ниже код?

Код: pascal
1.
SimpleT2 := SimpleT;
...
Рейтинг: 0 / 0
И снова потоки
    #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
И снова потоки
    #39610833
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimonkaТогда уж

Из-за особенностей реализации FreeOnTerminate это совершенно всё равно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
И снова потоки
    #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
И снова потоки
    #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
И снова потоки
    #39610845
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так точно не будет вопросов с переменной SimpleT :)
...
Рейтинг: 0 / 0
И снова потоки
    #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
И снова потоки
    #39610870
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchikРазве после выполнения, поток не должен уничтожиться и переменная SimpleT не должна стать Nil?

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

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

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

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

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

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

aidynchikРазве после выполнения, поток не должен уничтожиться?Он и "должен" и "уничтожился" (если поток правда завершился) .
aidynchikи переменная SimpleT не должна стать Nil?Не должна. Это простой типизированный указатель. Сам не меняется.
aidynchikAssigned(SimpleT) дает не nilПотому что указатель указывает на "теперь уже мусор".
А так как память при освобождении не обнуляется - может даже что-то из полей остаться там лежать, создавая иллюзию что там до сих пор данные, но фактически это мусор.
...
Рейтинг: 0 / 0
И снова потоки
    #39610956
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ого, за ночь сколько всего произошло :)
всем спасибо, этот форум реально the best
...
Рейтинг: 0 / 0
И снова потоки
    #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
И снова потоки
    #39611251
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

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

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

var a: array of byte;

a := nil;

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


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