TImage gif 刷新过程中

问题描述 投票:0回答:1

我有一个表格(

BorderStyle = bsNone
),只有一个
TImage
作为背景。
TImage
已加载 GIF。

调用

Show()
后,我启动一个使用
TSHFileOpStruct
复制文件的过程。 复制完成后,程序终止。

问题是,当复制开始时,GIF 会被冻结,直到该过程完成。 我会使用

TSHFileOpStruct
,因为当文件很多且尺寸很大时,它非常高效。

你有什么建议吗?

我尝试在

Application.Processmessages()
对象执行之前或之后使用
TSHFileOpStruct
,但没有任何变化。

multithreading delphi gif freeze
1个回答
0
投票

一切冻结的原因是因为您正在主 UI 线程的上下文中执行文件复制,从而阻塞消息循环,直到操作完成。 UI(包括 GIF)需要消息循环保持活动状态以处理绘画和动画请求。

您需要:

  • 通过

    TThread
    TTask
    将复制逻辑移动到单独的工作线程,这样您就不会再阻塞主 UI 线程。

  • 切换到不同的 API,例如

    IFileOperation
    CopyFileEx()
    ,这样您就可以在文件复制期间接收状态回调。
    SHFileOperation()
    不支持这一点。这样,您可以在复制过程中调用
    TForm.Update()
    Application.ProcessMessages()
    来保持 UI 响应。

© www.soinside.com 2019 - 2024. All rights reserved.