【发布时间】:2013-05-04 17:34:13
【问题描述】:
我有一个线程调用某种形式的函数来更新这个表单。任务完成后,线程使用Synchronize 使用结果更新表单,并且在程序运行时一切正常。
问题发生在线程正在运行并且我关闭程序时出现访问冲突。它是由已经发布的线程更新表单引起的。在重新安排表单创建的顺序(调用Application->CreateForm)后,它工作得很好,因为现在保存线程代码的表单是在更新表单之前创建的。似乎破坏顺序与创建顺序相反。
我还在表单析构函数中添加了一些代码,以确保如果表单在带有线程代码的表单之前被销毁,则线程终止。因此,在表单析构函数中重新排列表单创建顺序和/或代码可以解决问题。
但我有 3 个问题:
创建的表单被销毁的顺序是什么?是不是和我现在假设的创建顺序相反?
是否有更好的方法来完成上述任务 - 在线程完成数据处理后更新表单 GUI 项。现在我使用
Synchronize从线程本身做这件事,但有线程经验的人可能有更好的主意。我的另一个想法是甚至删除编译器生成的一堆CreateForm并手动创建它们,仅使用CreateForm创建主表单以更好地控制破坏顺序(如Rob Kennedy - http://pages.cs.wisc.edu/~rkennedy/createform 所建议)。在典型应用程序中动态表单创建/销毁的成本是多少?使用表单隐藏并保存在内存中或关闭时销毁它更好吗?
【问题讨论】:
-
1) 是的,以相反的顺序销毁 2) 重新发明了轮子。最好重新排列逻辑 3) 取决于您在它们上设计的内容,可能很重。
标签: multithreading delphi user-interface c++builder