我有一个表格(
BorderStyle = bsNone
),只有一个TImage
作为背景。 TImage
已加载 GIF。
调用
Show()
后,我启动一个使用 TSHFileOpStruct
复制文件的过程。
复制完成后,程序终止。
问题是,当复制开始时,GIF 会被冻结,直到该过程完成。 我会使用
TSHFileOpStruct
,因为当文件很多且尺寸很大时,它非常高效。
你有什么建议吗?
我尝试在
Application.Processmessages()
对象执行之前或之后使用 TSHFileOpStruct
,但没有任何变化。
一切冻结的原因是因为您正在主 UI 线程的上下文中执行文件复制,从而阻塞消息循环,直到操作完成。 UI(包括 GIF)需要消息循环保持活动状态以处理绘画和动画请求。
您需要:
通过
TThread
或 TTask
将复制逻辑移动到单独的工作线程,这样您就不会再阻塞主 UI 线程。
切换到不同的 API,例如
IFileOperation
或 CopyFileEx()
,这样您就可以在文件复制期间接收状态回调。 SHFileOperation()
不支持这一点。这样,您可以在复制过程中调用 TForm.Update()
或 Application.ProcessMessages()
来保持 UI 响应。