我想知道主线程外的VCL控件的读取值是否安全。
假设我从一个线程configure()
控件(没有TMemo/TEdit
),读取一行一行(或者它的标题属性),但也确保 {{ 1}}控制已被禁用和/或它的只读标志已被启用。
安全吗?
答案 0 :(得分:5)
不,这不安全。通过调用窗口过程(使用Perform
方法),传递WM_GETTEXTLENGTH
和WM_GETTEXT
来读取备忘录和编辑控件中的内容。 Win32要求在创建窗口的线程上执行此类代码,在本例中为主线程。因此,当您从工作线程中读取Text
属性时,您会破坏该规则,因为您在工作线程上调用Perform
,然后在错误的线程上执行窗口过程。
您可能会认为可以使用SendMessage
传递WM_GETTEXTLENGTH/WM_GETTEXT
来安排窗口过程在主线程上执行。但这是一个令人讨厌的竞争条件。您需要一个窗口句柄来使用SendMessage
,但访问工作线程上的Handle
属性不是线程安全的。这必须在主线程上完成,否则VCL窗口重新创建可能导致窗口由工作线程创建。 GUI窗口必须由主线程创建。