从Delphi中的不同线程更新TStringGrid

san*_*206 0 delphi multithreading

是否可以使用表的每列的线程更新TStringGrid?

我正在每个线程中进行一些计算,我想将它们添加到一个列中,到目前为止我有类似但有一个奇怪的错误.

在一个线程获得其列中当前行的结果后,它将调用此过程.

procedure TAnimator.Iteration(Sender: TObject);
begin
  TMyClass.AddData(TEngine(Sender).Data, TEngine(Sender).ID, TEngine(Sender).IterationsCount);
end;
Run Code Online (Sandbox Code Playgroud)

有时我得到一个表,其中包含正确添加的线程中的所有数据.但是,我可能会得到一个表,其中某些列中的第一个值未正确显示.

|| Col  1 || Col  2 || Col  3 || Col  4 ||
||    1   ||        ||        ||    4   ||
||    1   ||    2   ||        ||    4   ||
||    1   ||    2   ||    3   ||    4   ||
||    1   ||    2   ||    3   ||    4   ||
||    1   ||    2   ||    3   ||    4   || 
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

A TStringGrid是视觉控制.可视控件的线程规则是所有对可视控件的访问都必须从主GUI线程进行.你正在打破这个规则并承受后果.

您的解决方案是遵守规则.使用TThread.SynchronizeTThread.Queue确保访问可视控件的所有代码都在主GUI线程上执行.