Естественно, не срабатывает. Ты же блокируешь основной поток приложения:
Код:
procedure TMyThread1.Execute;
begin
{ Если Вы хотите, чтобы процедура DoWork выполнялась лишь один раз - удалите цикл while }
while not Terminated do
Synchronize(DoWork);
end;
Synchronize используется только для обновлнения данных в главном потоке. Нельзя все работу потока засунуть туда. Просто получается, что у тебя поток тупо блокирует главный поток приложения.
Править не буду, бо как надо перелопатить всю процедуру потока...