El problema del ProcessMessages es que no es multi-hilo real. Sigue todo secuencial en el mismo hilo
Ejemplo burdo:
Código Delphi
[-]
while Boolean do
begin
DoWork; Inc(PercentDone);
RefreshUI(PercentDone);
Application.ProcessMessages;
end;
Eso quiere decir que el ProcessMessages se ejecuta cada 5 segundos; osea la UI se actualiza cada 5 segundos. Es decir, la aplicacion queda "tildada" y responde a los eventos del mouse, teclado, etc, cada 5 segundos.
Lo de prohibido quiza si, es un poco de malvado de mi parte, pero no me gusta recomendar algo que se que es ineficaz