我经常将主表单句柄传递给其他线程,以便他们可以将消息发送回主线程。我在2013年9月28日看到,Remy Lebeau说:
... TWinControl.Handle属性也不是线程安全的。您 应该使用TApplication.Handle属性,或者使用 AllocateHWnd()创建自己的窗口。
在this answer中关于传递字符串的问题。
句柄属性如何不安全?它会在计划的生命周期中发生变化吗?
答案 0 :(得分:9)
Handle
属性如何不安全?
当您访问Handle
属性时,如果尚未创建窗口句柄,则会根据需要创建它。如果从GUI线程以外的线程访问Handle
属性,则表示您在错误的线程上创建窗口。
在程序的生命周期中是否会发生变化?
是的,如果重新创建窗口,窗口句柄可能会改变。
我经常将主表单句柄传递给其他线程,以便他们可以将消息发送回主线程。
在这种情况下,您可能无法远离主线程访问Handle
属性。听起来(虽然我看不到你的代码)你正在主线程上访问Handle
并将该值传递给另一个线程。
然而,窗口娱乐是你的问题。由于您的窗口需要重新创建,因此您根本无法依赖该线程超越您的线程。是否会重新创建窗口很难预测。 VCL不会轻易进行娱乐活动。但是,在我看来,安全比抱歉要好得多。因此,使用AllocateHWnd
并控制此窗口的生命周期。