Обращение к VCL в DoTerminate потока

  • Автор темы Shouldercannon
  • Дата начала
S

Shouldercannon

Можно ли в DoTerminate потока обращаться к VCL формы?
Код:
type

  TMy_Thread = class(TThread)
  private
    { Private declarations }
    s: String;
  protected
    procedure Execute; override;
    procedure DoTerminate; override;
  public
  end;
...
var
  Form2: TForm2;
  My_Thread: TMy_Thread;
...
procedure TForm2.PBBRefreshClick(Sender: TObject);
begin
  My_Thread := TMy_Thread.Create(True);
  My_Thread.FreeOnTerminate := True;
  My_Thread.Start;
end;

procedure TMy_Thread.Execute;
begin
  s := '1;2;3;4;5;';
  Terminate;
end;

procedure TMy_Thread.DoTerminate;
var
  Item: TListItem;
begin
  Form2.ListView1.SortType := stNone;
  Form2.ListView1.Items.BeginUpdate;
  Form2.ListView1.Items.Clear;

  while Pos(';', s) <> 0 do
  begin
    Item := Form2.ListView1.Items.Add;
    Item.Caption := Copy(s, 1, Pos(';', s) - 1);
    Delete(s, 1, Pos(';', s));
  end;

  Form2.ListView1.SortType := stBoth;
  Form2.ListView1.Items.EndUpdate;

// Form2.Show; // Нельзя. Code 1400. недопустимый дескриптор окна
end;
 
Последнее редактирование модератором:
M

-master-

DoTerminate это метод потока, и работает он в контексте потока а не в ГУИ потоке.
Поэтому обращаться к vcl в нем не безопасно. Отсюда все ваши беды.
И вообще этот метод служит для запуска обработчика события OnTerminate, если конечно его определил пользователь. И вот он уже работает именно в ГУИ потоке.
 
  • Нравится
Реакции: Shouldercannon
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!