【发布时间】:2015-04-03 12:36:14
【问题描述】:
使用:Delphi XE2,Windows VCL Forms 应用程序
TThread 可以在其执行期间更改主 VCL 线程中变量的值吗?
需要更新一个 Integer,它被声明为 TForm 类的一个字段。它将作为重载(并重新引入)的 Create 构造函数方法中的 var 变量传递给 TThread。
这有什么退路吗?
【问题讨论】:
-
有数以千计的关于这个主题的文章、问题和教程。到目前为止你发现了什么?您将此变量传递到线程的方法是错误的。您需要同步事件来更改值,或使用消息等其他方法。
-
我也不确定如何将 var 参数传递给线程的构造函数将允许线程更新该变量(除了在构造函数中)。您必须有一个指向该整数的指针才能执行此操作,这仍然不安全,因为该变量是 VCL 的一部分。
-
Thread-safe in delphi 的可能重复项
-
@JerryDodge 如果 int 只是 Form 中的一个字段,那么从技术上讲它不是 VCL - 它只是一个类字段。临界区或其他同步 obj 就可以了。
-
不要使用 reintroduce:1) 该功能是为特别狭窄的用例添加的。即使在那里,人们也应该尽一切努力不隐藏祖先方法,而不是隐藏存在问题的事实。 2)在您的特定情况下,您的线程需要获得所有相关信息才能完成其工作。
TThread.Create不是虚拟的。所以宁愿声明一个单一的股票标准constructor Create(<required params>);,就是这样。编写线程构造函数以获取所需的一切:不多不少。这样维护起来会容易得多。