我可以使用Editbox的OnChange事件来处理线程吗?

时间:2011-04-20 10:33:19

标签: multithreading delphi events synchronize

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

这样的事情:

//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;

3 个答案:

答案 0 :(得分:3)

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

  • 看起来你正在使用TEdit作为从线程传输数据的地方(依赖OnChange事件处理程序让我觉得需要更多处理,{{1不用作简单的“输出区域”)。 GUI元素永远不应该用于数据存储,无数原因包括性能到OOP封装以及依赖于您无法控制的算法。
  • 当您以编程方式更改文本时依赖于TEdit事件处理程序依赖于OnChange的实现细节。如果以编程方式进行更改,Microsoft决定不发起TEdit事件会怎样?或者Embarcadero决定有条件地不表现它,因为程序员不需要通知只是改变了这个值?

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

答案 1 :(得分:2)

假设您在一个线程中通过Synchronize()调用的过程中更改了EditBox文本值,则将在GUI线程中执行分配的OnChange事件。这将没有问题,但会停止你的线程单元处理事件。

答案 2 :(得分:0)

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