如何使用 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 部分与工作线程(以及所有业务逻辑)分开。即使在小程序中,因为它们往往会随着时间的推移而增长,突然间您会发现自己(或同事)处境不利,因为有很多代码难以维护或理解。
如何使用 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 部分与工作线程(以及所有业务逻辑)分开。即使在小程序中,因为它们往往会随着时间的推移而增长,突然间您会发现自己(或同事)处境不利,因为有很多代码难以维护或理解。