TAnimate en Windows XP / Vista con temas habilitados no funcionará

Un compañero de trabajo ha estado utilizando un AVI personalizado para indicar el progreso durante algunas operaciones más largas durante años. Siempre ha funcionado bien.

Recientemente, decidió pasar de Delphi 7 a Delphi 2007, en parte para obtener soporte de temas para sus aplicaciones. (Finalmente, la mayoría de las personas, pero no todas, se ejecutan en XP). La animación dejó de funcionar. Desactivar temas hace que funcione de nuevo.

TAnimate es un envoltorio alrededor del control de animación de Windows, creado mediante InitCommonControlsEx (ICC_ANIMATE_CLASS). La documentación de MSDN dice que "Si está utilizando ComCtl32.dll versión 6, el subproceso no es compatible, por lo tanto, asegúrese de que su aplicación no bloquee la interfaz de usuario o la animación no se producirá". Obviamente, este es el comportamiento previsto.

¿Alguien tiene alguna sugerencia para una solución o alternativa a este problema? El procesamiento para el que está intentando mostrar el progreso no se presta para generar un subproceso separado, y por razones obvias, Application.ProcessMessages tampoco es una buena solución.

EDITAR: Le estoy dando a Rob Kennedy la respuesta correcta a esta pregunta, porque a) él proporcionó el "eslabón perdido" (juego de palabras destinado) al post de Raymond Chen en este tema, yb) porque, por supuesto, moviendo las cosas a un hilo separado Fue la respuesta correcta.

Lo irónico aquí: la operación que estaba llevando a cabo y que bloqueaba el TAnimate era una operación de indexación para un motor de base de datos que utilizamos (Advantage Database Server, o ADS). Él no mencionó eso cuando vino a mí con el problema.

ADS admite una devolución de llamada de progreso utilizando los métodos TAdsDataSet.AdsRegisterCallbackFunction y TAdsDataSet.AdsClearCallbackFunction. La función de devolución de llamada se proporciona tanto el progreso (en porcentaje) de la operación actual como una forma de cancelar la operación por medio del valor de retorno de la función. Así que toda la pregunta resulta ser discutible; La función de devolución de llamada se puede utilizar para actualizar una barra de progreso, que indica al usuario que la aplicación no está bloqueada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta