没有同步从线程读取值是否安全?

时间:2016-11-18 21:27:05

标签: multithreading delphi vcl

我想知道主线程外的VCL控件的读取值是否安全。

假设我从一个线程configure()控件(没有TMemo/TEdit),读取一行一行(或者它的标题属性),但也确保 {{ 1}}控制已被禁用和/或它的只读标志已被启用。

安全吗?

1 个答案:

答案 0 :(得分:5)

不,这不安全。通过调用窗口过程(使用Perform方法),传递WM_GETTEXTLENGTHWM_GETTEXT来读取备忘录和编辑控件中的内容。 Win32要求在创建窗口的线程上执行此类代码,在本例中为主线程。因此,当您从工作线程中读取Text属性时,您会破坏该规则,因为您在工作线程上调用Perform,然后在错误的线程上执行窗口过程。

您可能会认为可以使用SendMessage传递WM_GETTEXTLENGTH/WM_GETTEXT来安排窗口过程在主线程上执行。但这是一个令人讨厌的竞争条件。您需要一个窗口句柄来使用SendMessage,但访问工作线程上的Handle属性不是线程安全的。这必须在主线程上完成,否则VCL窗口重新创建可能导致窗口由工作线程创建。 GUI窗口必须由主线程创建。