如何使用 TThread.Synchronize() 检索 TEdit 控件的文本?

How to use TThread.Synchronize() to retrieve the text of a TEdit control?

如何使用 TThread.Synchronize() 检索 TEdit 控件的文本。我应该将 TEdit 文本分配给全局变量还是什么?

首先,在表单中声明一个检索文本的方法。 这个方法可以从主线程和工作线程调用:

Type
  TMyGetTextProc = procedure(var s: String) of object;

procedure TForm1.GetMyText(var myText: String);
begin
  TThread.Synchronize(nil,
    procedure 
    begin
      myText := ATedit.Text;
    end
  );
end;

其次,创建线程时,在create方法中传入(callback)方法,并使用它以线程安全的方式获取文本:

Type
  TMyThread = Class(TThread)
  private
    FGetTextCallback: TMyGetTextProc;
  public
    constructor Create(aGetTextProc: TMyGetTextProc);
  ...
  end;

请注意,如果您愿意,也可以直接从您的线程进行同步。关键是你传递一个回调方法给工作线程。

正如 David 在评论中提到的那样,始终将 UI 部分与工作线程(以及所有业务逻辑)分开。即使在小程序中,因为它们往往会随着时间的推移而增长,突然间您会发现自己(或同事)处境不利,因为有很多代码难以维护或理解。