Предполагаю, что процедура procedure TIceThread.DoThawing; работает самостоятельно - независимо от потока, поскольку цикл запускается не в потоке (OnExecute), а в самой процедуре, и получается так, что поток запущен, и он не остановится, пока не выполнит процедуру. Вот этот цикл:
Код:
i := 255;
while not Terminated and (i > 0) do
begin
i := i - 0.00001;
Synchronize(Ice);
end;
должен быть на потоке, переменная i должна быть объявлена в экземпляре потока или глобально (попробуйте и так, и так). А вот процедура, которая и будет растворять форму (её надо синхронизировать):
Код:
Procedure TIceThread.Ice;
Begin
FMain.AlphaBlendValue := trunc(i);
End;
Мне непонятно одно: зачем использовать переменную типа Double - используйте целую переменную (Byte), прибавляйте 1, а чтобы скорость регулировать, можно в цикле потока Sleep(Speed); написать, где Speed - целая переменная, регулирующая скорость.
Кстати, по таймеру растворять форму гораздо легче.