delphi – 为什么不在组件创建或流式传输期间使用句柄?

delphi – 为什么不在组件创建或流式传输期间使用句柄?,第1张

概述我想通过SDL_CreateWindowFrom函数创建一个自定义VCL控件来包装SDL渲染表面. SDL_CreateWindowFrom获取现有的HWND句柄并将高性能渲染上下文(它有几个后端可用,包括DirectX和OpenGL)放在其上. 帮助文件说“在组件创建或流式传输期间不要引用Handle属性”.但它并没有说明原因.它说,当您第一次尝试访问Handle属性时,它将调用HandleNe 我想通过SDL_CreateWindowFrom函数创建一个自定义VCL控件来包装SDL渲染表面. SDL_CreateWindowFrom获取现有的HWND句柄并将高性能渲染上下文(它有几个后端可用,包括DirectX和OpenGL)放在其上.

帮助文件说“在组件创建或流式传输期间不要引用Handle属性”.但它并没有说明原因.它说,当您第一次尝试访问Handle属性时,它将调用HandleNeeded以确保存在有效句柄.

所以我有两个问题. 1:在组件创建期间不应引用Handle属性的原因是什么? 2.如果控件的整个点是要包装需要初始化HWND的渲染表面,那么何时可以安全地执行(理想情况下)应该在创建/流式传输期间进行的初始化?

解决方法 在它的核心,它是一个表现的东西.由于在流式传输过程中可能会发生其他可能发生的“坏”副作用.事情处于“中期建设”状态,通常预计会出现这种情况.

当您引用“Handle”属性时,这将启动句柄创建过程.这是因为读取Handle实际上调用了GetHandle.在流式传输过程中这么做太快,你可能最终会得到更慢的流媒体性能,更糟糕的是,部分配置的“句柄”.

如果需要在属性设置器中正确引用句柄,则应通过检查HandleAllocated来检查是否已创建句柄,然后才引用它.如果你需要对句柄进行一些标志更改,比如调用SetwindowLong()或其他东西,那么你应该在组件实例中“缓存”该状态,然后覆盖CreateWnd并在那时应用这些设置.另一种选择是在流式传输时推迟所有句柄访问(如果在ComponentState中为csloading),直到调用Loaded虚方法.

最后,您需要了解可能需要重新创建句柄的情况.如果周围的表单或父组件的句柄经过重新创建过程,则会发生这种情况.直到更新的Windows版本,更改某些窗口标志的唯一方法是销毁句柄并在CreateWindowEx()调用中使用新标志重新创建.有许多组件仍然可以做到这一点.通过检查(控制状态中的csRecreating),您知道是否处于重新创建状态.

因此,要直接回答您的问题,最好的地方是覆盖CreateWnd并在那里完成您的工作.只有在创建句柄时才会调用CreateWnd.正确设计的组件在显示之前应该只对CreateWnd进行一次调用.

总结

以上是内存溢出为你收集整理的delphi – 为什么不在组件创建或流式传输期间使用句柄?全部内容,希望文章能够帮你解决delphi – 为什么不在组件创建或流式传输期间使用句柄?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1270835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存