当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《为什么不在组件创建或流式传输期间使用句柄?》经验,为你挑选了1个好方法。

我想通过SDL_CreateWindowFrom函数创建一个自定义VCL控件来包装SDL渲染表面.SDL_CreateWindowFrom获取现有的HWND句柄并将高性能渲染上下文(它有几个后端可用,包括DirectX和OpenGL)放在其上.

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

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



1> Allen Bauer..:

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

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

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

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

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有