Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
Delphi 如何使用TThread.Synchronize()检索TEdit控件的文本?_Delphi_C++builder - Fatal编程技术网

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线程需要始终检查该值,而不仅仅是一次。