是否可以使用表中每列的线程来更新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 ||
答案 0 :(得分:5)
TStringGrid
是视觉控制。可视控件的线程规则是所有对可视控件的访问都必须从主GUI线程进行。你违反了这条规则并承受了后果。
您的解决方案是遵守规则。使用TThread.Synchronize
或TThread.Queue
确保访问可视控件的所有代码都在主GUI线程上执行。
答案 1 :(得分:0)
在单独的线程上进行计算没有问题。但是,您必须使用主线程的计算结果更新网格。
有两种相当简单的方法:
OnTerminate
事件以更新所需列中的所有单元格。Synchronize()
更新网格的特定单元格。这应该让你开始。如果您在使用详细信息时遇到问题,则现有问题涉及OnTerminate
和Synchronize
。如果你仍然卡住了,可以随意提出另一个问题。