从Delphi中的不同线程更新TStringGrid

时间:2014-05-08 20:21:11

标签: multithreading delphi

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

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

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

procedure TAnimator.Iteration(Sender: TObject);
begin
  TMyClass.AddData(TEngine(Sender).Data, TEngine(Sender).ID, TEngine(Sender).IterationsCount);
end;

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

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

2 个答案:

答案 0 :(得分:5)

TStringGrid是视觉控制。可视控件的线程规则是所有对可视控件的访问都必须从主GUI线程进行。你违反了这条规则并承受了后果。

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

答案 1 :(得分:0)

在单独的线程上进行计算没有问题。但是,您必须使用主线程的计算结果更新网格。

有两种相当简单的方法:

  • 对线程中的整个列执行所有计算。然后处理OnTerminate事件以更新所需列中的所有单元格。
  • 每次有新值时,使用线程中的Synchronize()更新网格的特定单元格。

这应该让你开始。如果您在使用详细信息时遇到问题,则现有问题涉及OnTerminateSynchronize。如果你仍然卡住了,可以随意提出另一个问题。