我有一个应用程序,其中大多数操作需要一些时间,我希望始终保持GUI响应.用户触发的任何操作的基本模式如下:
我尝试了几个方法来实现这一目标,但从长远来看,所有这些都会导致问题(在某些情况下看似随机访问违规).
Synchronize调用OnFinish主线程中的事件.PostMessage通知GUI线程结果已准备就绪.Application.ProcessMessages)直到后台线程完成,然后继续显示结果.我无法想出另一种选择,但这对我来说都不是很完美.这样做的首选方法是什么?
在运行时应用新样式后,我的应用程序的MainForm创建一个新的窗口句柄 - 有没有办法停止此操作或重新分配句柄,因为我得到了一吨以下错误:
'系统错误.代码:1400.窗口句柄无效'
有没有办法操纵强制分配新句柄的过程?
我解决了这个问题:
我的主要表单创建了一个从未显示的看不见的"帮助"表单,但它确实有可视组件 - 它在尝试重绘这些可视组件时抛出了句柄错误,所以我用对象替换了相关组件(注意我最初没有写这段代码).
我想通过SDL_CreateWindowFrom函数创建一个自定义VCL控件来包装SDL渲染表面.SDL_CreateWindowFrom获取现有的HWND句柄并将高性能渲染上下文(它有几个后端可用,包括DirectX和OpenGL)放在其上.
帮助文件说"在组件创建或流式传输期间不要引用Handle属性".但它并没有说明原因.它说,当您第一次尝试访问Handle属性时,它将调用HandleNeeded以确保存在有效句柄.
所以我有两个问题.1:在组件创建期间不应引用Handle属性的原因是什么?2.如果控件的整个点是要包装需要初始化HWND的渲染表面,那么何时可以安全地执行(理想情况下)应该在创建/流式传输期间进行的初始化?
我最近调试了一个复杂的bug.这是由访问不存在的Form.Handle(带状指针)引起的.这个bug以相当意想不到的方式向我揭示 - 访问Forms会Handle导致调整大小和重新绘制.
我希望Form.Handle通过垃圾指针访问只会返回一些垃圾THandle.期望Handle在表单创建时创建一次并保持相同直到Form被销毁.
为什么会这样,这TForm.Handle不是一个在表单创建时初始化并通过访问的字段
property Handle: Integer read FHandle;
Run Code Online (Sandbox Code Playgroud)
,但是是一个吸气剂
property Handle: Integer read GetHandle;
Run Code Online (Sandbox Code Playgroud)
CreateWnd在第一次访问时创建Handle甚至Window()?
delphi ×4
vcl ×2
asynchronous ×1
delphi-xe ×1
delphi-xe2 ×1
handle ×1
sdl ×1
tform ×1
vcl-styles ×1