Multithreading TForm.Handle是线程安全的吗?

Multithreading TForm.Handle是线程安全的吗?,multithreading,delphi,postmessage,Multithreading,Delphi,Postmessage,我经常将主窗体句柄传递给其他线程,以便它们可以将消息发回主线程。我看到2013年9月28日,Remy Lebeau说: …TWinControl.Handle属性也不是线程安全的。你 应改用TApplication.Handle属性,或使用 AllocateHWnd()创建您自己的窗口 在回答有关传递字符串的问题时 句柄属性如何不安全?在程序的生命周期中,它会发生变化吗 句柄属性如何不安全 访问句柄属性时,如果尚未创建窗口句柄,则会根据需要创建它。如果从GUI线程以外的线程访问Handle属性,

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

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

在回答有关传递字符串的问题时

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

句柄
属性如何不安全

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

在程序的生命周期中,它会发生变化吗

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

我经常将主窗体句柄传递给其他线程,以便它们可以将消息发回主线程

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


然而,橱窗娱乐对你来说是个问题。因为你的窗口是可以重新创建的,所以你不能简单地依赖于线程之外的句柄。很难预测是否会重新创建窗口。VCL不能轻松执行娱乐。然而,在我看来,安全远胜于遗憾。因此,使用
AllocateHWnd
并控制此窗口的生存期。

是的,它可以更改。可以重新创建窗口。如果是,则旧句柄将不再有效。在某些情况下@DalijaPrasnikar
AllocateHwnd
不能从线程安全地调用-这并不意味着不能在主线程上调用它并将它返回的句柄传递给工作线程。没关系。@J。。。我知道…,在我意识到我没有清楚地表达自己之后,我更新了我的评论。值得注意的是,窗口重新创建可以通过一些简单的操作触发,比如更改表单属性,而表单属性只能通过调用
CreateWindowEx
@J来设置。另一方面,VCL不会相应地更新许多可以动态更新而无需重新创建的窗口属性。它通常只是强制完全重新创建,并在重写的
CreateParams()
CreateWnd()
方法中应用最新的属性值。大多数情况是因为并非所有版本的Windows都允许在不重新创建窗口句柄的情况下更改某些样式。如果我们现在支持的Windows版本中有一些不需要重新创建句柄(XP现在不在支持的版本列表中),请在我们的质量门户()中报告。使用TApplication.handle怎么样?这难道不能保证在应用程序的生命周期内有效吗?您可以这样做。但是你必须钩住它的窗口程序。完全可以使用
TApplication.HookMainWindow
。使用
AllocateHWnd
到底有什么问题?