通过调用更改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;
答案 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中更改内容是正确的方法。我不确定我是否理解了你的其余问题。