Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 线程正在桌面上写入_Multithreading_Delphi_Delphi 7 - Fatal编程技术网

Multithreading 线程正在桌面上写入

Multithreading 线程正在桌面上写入,multithreading,delphi,delphi-7,Multithreading,Delphi,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

我试图创建一个运行时线程,但该线程的行为异常,代码没有画布引用

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;


有人有办法解决这个奇怪的问题吗?

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

其他意见:

  • 在thread方法外部设置FreeOnTerminate
  • 调用Terminate作为线程方法的最后一步是毫无意义的。线程即将终止

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

      其他意见:

      • 在thread方法外部设置FreeOnTerminate
      • 调用Terminate作为线程方法的最后一步是毫无意义的。线程即将终止

      某个地方可能有人有意这样做。有关VCL和线程的更多信息,请参阅。某个地方可能有人有意这样做。有关VCL和线程的更多信息,请参阅。实际上,问题在于未同步的方法。谢谢。在
      Execute()
      内部设置
      FreeOnTerminate
      非常安全。直到退出
      Execute()
      之后,才会对其进行计算。至于在
      Execute()
      结束时调用
      Terminate()
      ,如果在
      Execute()
      退出后查看
      Terminated
      属性以了解
      Execute()
      是否优雅地退出,有时会很有用,特别是在没有
      FatalException
      属性的旧版本中。@Remy因为外部的代码需要了解FreeOnTerminate,所以在我看来,将其设置在外部是很有意义的。实际上,问题在于未同步的方法。谢谢。在
      Execute()
      内部设置
      FreeOnTerminate
      非常安全。直到退出
      Execute()
      之后,才会对其进行计算。至于在
      Execute()
      结束时调用
      Terminate()
      ,如果在
      Execute()
      退出后查看
      Terminated
      属性以了解
      Execute()
      是否优雅地退出,有时会很有用,尤其是在没有
      FatalException
      属性的旧版本中。@Remy因为外部的代码需要了解FreeOnTerminate,所以在我看来,将其设置在外部是很有意义的。