TForm.Handle线程安全吗?

时间:2015-07-16 17:37:34

标签: multithreading delphi postmessage

我经常将主表单句柄传递给其他线程,以便他们可以将消息发送回主线程。我在2013年9月28日看到,Remy Lebeau说:

  

... TWinControl.Handle属性也不是线程安全的。您   应该使用TApplication.Handle属性,或者使用   AllocateHWnd()创建自己的窗口。

this answer中关于传递字符串的问题。

句柄属性如何不安全?它会在计划的生命周期中发生变化吗?

1 个答案:

答案 0 :(得分:9)

  

Handle属性如何不安全?

当您访问Handle属性时,如果尚未创建窗口句柄,则会根据需要创建它。如果从GUI线程以外的线程访问Handle属性,则表示您在错误的线程上创建窗口。

  

在程序的生命周期中是否会发生变化?

是的,如果重新创建窗口,窗口句柄可能会改变。

  

我经常将主表单句柄传递给其他线程,以便他们可以将消息发送回主线程。

在这种情况下,您可能无法远离主线程访问Handle属性。听起来(虽然我看不到你的代码)你正在主线程上访问Handle并将该值传递给另一个线程。

然而,窗口娱乐是你的问题。由于您的窗口需要重新创建,因此您根本无法依赖该线程超越您的线程。是否会重新创建窗口很难预测。 VCL不会轻易进行娱乐活动。但是,在我看来,安全比抱歉要好得多。因此,使用AllocateHWnd并控制此窗口的生命周期。

相关问题