线程正在桌面上写

Raf*_*ael 1 delphi multithreading delphi-7

我试图创建一个运行时线程,但线程表现得很奇怪,代码没有画布引用.

procedure TBruteThread.Execute;
var
  j: Integer;
begin
  inherited;
  FreeOnTerminate:=True;
  for j:=1 to StrToInt(Form1.Edit1.Text) do begin
    if Terminated then break;
    Form1.Label2.Caption:=IntToStr(j);
  end;
  Form1.Label2.Caption:='Thread is destroyed';
  Self.Terminate;
end;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有人有任何想法解决这个奇怪的问题吗?

Dav*_*nan 5

您的代码的问题在于它违反了VCL线程规则.必须从主线程访问VCL组件.使用Synchronize或Queue(TThread的方法)在主线程上执行GUI更新.

其他的建议:

  • 在线程方法之外设置FreeOnTerminate.
  • 调用Terminate作为线程方法的最终行为是没有意义的.该线程即将终止.

  • 在`Execute()`中设置`FreeOnTerminate`是完全正确和安全的.直到`Execute()`退出后才会进行评估.至于在`Execute()`的末尾调用`Terminate()`,它有时会很有用,如果在`Execute()`退出之后查看`Terminated`属性来知道`Execute()`是否退出优雅与否,特别是在没有`FatalException`属性的旧版本中. (2认同)