0

通过调用更改值的方法,通过OnChange事件从线程获取响应是正确的方法吗?EditboxsynchronizeEditbox

像这样的东西:

//Extra Thread
procedure HThread.Execute;
begin
    Synchronize(CallGUI);
end;

procedure HThread.CallGUI;
begin
  Edit.Text = 'Hello';
end;


//Main Thread
procedure Main;
begin
  Tr := HThread.Create(true);
  Tr.Edit := Form1.Edit1;
  Tr.Resume;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ShowMessage('Response from extra thread :' + Edit1.text);
end;
4

3 回答 3

3

由于以下几个原因,您的使用TEdit很麻烦:

  • 看起来您将TEdit用作从线程传输数据的地方(对OnChange事件处理程序的依赖使我认为需要进行更多处理,而TEdit不是将其用作简单的“输出区域”)。GUI 元素永远不应该用于数据存储,从性能到 OOP 封装以及依赖于您无法控制的算法等无数原因。
  • 当您以编程方式更改文本时,依赖OnChange事件处理程序触发依赖于TEdit. OnChange如果以编程方式进行更改,如果 Microsoft 决定不触发该事件怎么办?或者 Embarcadero 决定有条件地不显示它,因为不需要通知程序员只是更改了该值?

除此之外,您的使用Syncronize()可能会起作用,即“您可以使用它”,但我会说这不是一个好主意。我想提出一个更好的解决方案,但不能这样做,因为我不知道你到底想做什么。如果您只想强制OnChange被解雇,请保留您的代码。

于 2011-04-20T11:50:41.213 回答
2

假设您在通过线程调用的过程中更改 EditBox 文本值Synchronize(),则分配的OnChange事件将在 GUI 线程中执行。这将毫无问题地工作,但会在处理事件时停止您的线程。

于 2011-04-20T10:55:08.727 回答
0

Synchronize()如果您的意思是,通过更改 UI 中的某些内容是正确的方法。不过,我不确定我是否理解您的其余问题。

于 2011-04-20T10:40:06.630 回答