// MsgWaitForMultipleObjects를 이용해 시간 지연시키기
//
// Sleep과 같은 기능을 하지만 Sleep으로 시간 지연을 하면 메시지 처리를 할 수 없기 때문에 일명'창렉'이 걸리지만,
// 아래 함수는 메시지를 처리하면서 지연을 걸어주기 때문에 창렉이 걸리지 않습니다.
// 사용법도 Sleep이랑 같습니다.
//
// WaitForTimer(1000); <- 1초간 지연을 시킵니다.


procedure
WaitForTimer(MilliSeconds :  LongInt);
const
        _SECOND = -10000;
var
        lBusy : LongInt;
        hTimer : HWND;
        liDueTime : LARGE_INTEGER;

begin
        hTimer := CreateWaitableTimer(nil, True, 'WaitableTimer');

        if hTimer = 0 then Exit;

        liDueTime.QuadPart := _SECOND * MilliSeconds;
        SetWaitableTimer(hTimer, TLargeInteger(liDueTime), 0, nil, nil, False);

        repeat
                lBusy := MsgWaitForMultipleObjects(1, hTimer, False, INFINITE, QS_ALLINPUT);
                Application.ProcessMessages; 
        until lBusy = WAIT_OBJECT_0;

        CloseHandle(hTimer);

end;