是否可以使用线程为表中的每一列更新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 || 发布于 2014-05-09 05:45:35
TStringGrid是一个可视控件。可视控件的线程规则是,对可视控件的所有访问都必须从主GUI线程进行。你违反了这条规则并承受了后果。
你的解决方案是遵守规则。使用TThread.Synchronize或TThread.Queue确保访问可视控件的所有代码都在主GUI线程上执行。
发布于 2014-05-13 01:11:37
在不同的线程上进行计算是没有问题的。但是,您必须使用来自主线程的计算结果来更新网格。
有两种相当简单的方法:
OnTerminate事件以更新所需列中的所有单元格。Synchronize()在每次有新值可用时更新网格中的特定单元格。这应该可以让你开始学习了。如果你在细节上有困难,这里有关于OnTerminate和Synchronize的现有问题。如果你仍然被卡住了,请随时问另一个问题。
https://stackoverflow.com/questions/23551756
复制相似问题