加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:43:17 所属栏目:大数据 来源:网络整理
导读:我想通过SDL_CreateWindowFrom函数创建一个自定义VCL控件来包装SDL渲染表面. SDL_CreateWindowFrom获取现有的HWND句柄并将高性能渲染上下文(它有几个后端可用,包括DirectX和OpenGL)放在其上. 帮助文件说“在组件创建或流式传输期间不要引用Handle属性”.但它
我想通过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进行一次调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读