Delphi 如何使用TThread.Synchronize()检索TEdit控件的文本?
如何使用Delphi 如何使用TThread.Synchronize()检索TEdit控件的文本?,delphi,c++builder,Delphi,C++builder,如何使用TThread.Synchronize()检索TEdit控件的文本。我应该将TEdit文本指定给全局变量还是其他什么?首先,在表单中声明一个检索文本的方法。 可以从主线程和工作线程调用此方法: Type TMyGetTextProc = procedure(var s: String) of object; procedure TForm1.GetMyText(var myText: String); begin TThread.Synchronize(nil, pro
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部分与工作线程(以及所有业务逻辑)分开。即使是在小程序中,因为它们往往会随着时间的推移而增长,突然间,您发现自己(或同事)的处境很糟糕,有大量难以维护或理解的代码 你真的不想让你的线程知道你的UI内部。您需要隔离程序的这些不同方面。@David Heffernan我正在编写一个非常小的程序,这是我需要执行的唯一UI控件访问。我将创建一个允许线程请求值的接口。该接口的实现可以是与主线程同步以获取值。我当然不会使用全局变量。然而,听起来好像你不在乎以优雅的方式做事,所以我不确定该推荐什么。@David Heffernan我的程序实际上非常小(只有一种形式),因此,我想在这种情况下,将
TEdit
文本放在全局变量:)@EProgrammerNotFound线程需要始终检查该值,而不仅仅是一次。