Т.е. как бы получается, что к моменту, когда надо в следующий раз сделать repaint у Вас еще первый не завершился...
Если Вы (точнее рабочая станция на которой тестируется приложение) не можете обеспечить достаточно быстрое рисование функциями GDI, то надо либо прореживать попытки рисования, либо использовать другие методы подготовки изображений (если это конечно возможно).
Например, попробуем для начала не быстрее рисовать, а избавиться от зависания. Допустим процедура, которая выпоняет некое рисование у Вас в коде выделена как отдельная (скорее всего это так и есть). По пробуйте ее реорганизовать так, чтобы во время ее выполнения другие вызовы этой же процедуры ничего не делали.
Самый простой способ:
Код: Выделить всё
const flg:boolean=true;
procedure XXXXX;
begin
if flg then begin
flg:=false;
try
//что-то делаем
finally
flg:=true;
end;
end;
end;
Правда если повторный вызов произойдет между if и flg:=false то получится тоже плохая ситуация (хотя и весьма весьма маловероятная).
Можно также использовать объекты синхронизации, которые специально для таких вещей предназначены.
Семафоры, например. Создать семафор в момент инициализации формы, такой, чтобы "только один поезд пропускал", если можно так выразиться. В начале процедуры занимать семафор, а в конце отпускать. А если занять не удалось, то делать выход их процедуры. Т.е. (продолжая железнодорожную

аналогию) если семафор закрыт, то поезд под откос, чтобы путь не занимал
см CreateSemaphore и связанные функции
Вообще хотельсь бы заметить, что перерисовка чаще 10 раз в секунду в большинстве задач не имеет смысла, так как глазу обычного человека это как-то не очень вообще заметно. Также перерисовка с частотой выше частоты развертки (от 50Гц до "у кого как") тоже не имеет смысла, так как на мониторе не сможет быть адекватно воспроизведена...