Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
evgen29
Member

Откуда:
Сообщений: 157
Здравствуйте! Чего-то я затупил. В Дельфе 7 создаю тип и переменную потока:
type
  TLecSendRestThread = class(TThread)
  private
    procedure MainProc;
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  LecSendRestThread: TLecSendRestThread;


делаю вызов потока:
  if LecSendRestThread = nil then
  begin
    LecSendRestThread := TLecSendRestThread.Create(True);
    LecSendRestThread.FreeOnTerminate := True;
    LecSendRestThread.Priority := tpIdle;
  end;
  LecSendRestThread.Resume;


после того как после вызова Terminate потока заканчивается цикл:
  while not Terminated do
  begin
    Synchronize(MainProc);
  end;


переменная потока LecSendRestThread не становится равной nil. Хотя я явно указал перед запуском LecSendRestThread.FreeOnTerminate := True;
Подскажите, где я чего упустил из виду.
18 май 20, 13:38    [22134979]     Ответить | Цитировать Сообщить модератору
 Re: Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49980

Основы языка и устройство компьютера. Освобождение динамической памяти не означает
автоматического обнуления всех указателей на неё.

Posted via ActualForum NNTP Server 1.5

18 май 20, 13:42    [22134982]     Ответить | Цитировать Сообщить модератору
 Re: Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
evgen29
Member

Откуда:
Сообщений: 157
Dimitry Sibiryakov,

спасибо. Уже прочитал, что после удаления потока надо сделать LecSendRestThread:=nil; , чтобы убрать указатель в никуда. Хотя странно, что это не делается автоматически самим классом.

Сообщение было отредактировано: 18 май 20, 13:52
18 май 20, 13:53    [22134999]     Ответить | Цитировать Сообщить модератору
 Re: Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
bk0010
Member

Откуда:
Сообщений: 4935
evgen29
переменная потока LecSendRestThread не становится равной nil.
Так и должно быть.
А
Synchronize(MainProc);
говорит о том, что тред вам не нужен: MainProc выполняется в главном потоке.
18 май 20, 13:58    [22135015]     Ответить | Цитировать Сообщить модератору
 Re: Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11759
evgen29
Хотя странно, что это не делается автоматически самим классом.

LecSendRestThread := TLecSendRestThread.Create(True);
myThread := LecSendRestThread;
ObjList.Add(LecSendRestThread);
Что будем обнулять?
18 май 20, 13:58    [22135016]     Ответить | Цитировать Сообщить модератору
 Re: Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
DimaBr
Member

Откуда:
Сообщений: 11653
evgen29
переменная потока LecSendRestThread не становится равной nil. Хотя я явно указал перед запуском LecSendRestThread.FreeOnTerminate := True;

А когда уничтожение объекта(Free) самостоятельно обнуляло(NIL) указатель(переменная) на объект ?
18 май 20, 14:33    [22135058]     Ответить | Цитировать Сообщить модератору
 Re: Delphi thread не становится nil после Terminate и выхода из цикла Execute  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
evgen29
while not Terminated do
  begin
    Synchronize(MainProc);
  end;

В чем сакральный смысл отдельного потока?
18 май 20, 14:59    [22135075]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить