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作为线程方法的最后一步是毫无意义的。线程即将终止
- 在thread方法外部设置FreeOnTerminate
- 调用Terminate作为线程方法的最后一步是毫无意义的。线程即将终止
- 您的代码的问题在于它违反了VCL线程规则。必须从主线程访问VCL组件。使用Synchronise或Queue(TThread的方法)在主线程上执行GUI更新
其他意见:
Execute()
内部设置FreeOnTerminate
非常安全。直到退出Execute()
之后,才会对其进行计算。至于在Execute()
结束时调用Terminate()
,如果在Execute()
退出后查看Terminated
属性以了解Execute()
是否优雅地退出,有时会很有用,特别是在没有FatalException
属性的旧版本中。@Remy因为外部的代码需要了解FreeOnTerminate,所以在我看来,将其设置在外部是很有意义的。实际上,问题在于未同步的方法。谢谢。在Execute()
内部设置FreeOnTerminate
非常安全。直到退出Execute()
之后,才会对其进行计算。至于在Execute()
结束时调用Terminate()
,如果在Execute()
退出后查看Terminated
属性以了解Execute()
是否优雅地退出,有时会很有用,尤其是在没有FatalException
属性的旧版本中。@Remy因为外部的代码需要了解FreeOnTerminate,所以在我看来,将其设置在外部是很有意义的。