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

Shouldercannon

Well-known member
25.05.2010
128
0
#1
Можно ли в 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;
 
Последнее редактирование:

-master-

Well-known member
14.01.2012
616
12
#2
DoTerminate это метод потока, и работает он в контексте потока а не в ГУИ потоке.
Поэтому обращаться к vcl в нем не безопасно. Отсюда все ваши беды.
И вообще этот метод служит для запуска обработчика события OnTerminate, если конечно его определил пользователь. И вот он уже работает именно в ГУИ потоке.