首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中从不同线程更新TStringGrid

在Delphi中从不同线程更新TStringGrid
EN

Stack Overflow用户
提问于 2014-05-09 04:21:11
回答 2查看 814关注 0票数 0

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

我在每个线程中做一些计算,我想将它们添加到一个列中,到目前为止,我得到了类似的结果,但有一个奇怪的错误。

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

代码语言:javascript
复制
procedure TAnimator.Iteration(Sender: TObject);
begin
  TMyClass.AddData(TEngine(Sender).Data, TEngine(Sender).ID, TEngine(Sender).IterationsCount);
end;

有时我会得到一个正确添加了来自线程的所有数据的表。但是,我可能会得到一个表,其中某些列中的第一个值不能正确显示。

代码语言:javascript
复制
|| 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   || 
EN

回答 2

Stack Overflow用户

发布于 2014-05-09 05:45:35

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-05-13 01:11:37

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

有两种相当简单的方法:

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

这应该可以让你开始学习了。如果你在细节上有困难,这里有关于OnTerminateSynchronize的现有问题。如果你仍然被卡住了,请随时问另一个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23551756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档