No tengo claro si necesitas hacerlo de esa forma concreta por algún motivo. Yo entiendo del enunciado que quieres ejecutar un código cada 2 horas. Leyendo el código y como quieres hacerlo dentro de un bucle y ya sabemos lo que pasa con los bucles infinitos se trata de ejecutar una sentencia cada dos horas mientras no se cumpla con una condición de ruptura. De tu código deduzco que esa condición de ruptura es debe <= hay.
Código Delphi
[-]
while debe <= hay do begin
sleep(7200000);
recorre; end;
A mí también me parece mejor utilizar un ttimer para este tipo de cosas. De todas formas si necesitas la hora del servidor, consultar horas en bd y realmente lo que necesitas es una diferencia entre horas este sistema supongo que no te servirá. Como siempre, espero que recorre se encargue de incrementar debe hasta que iguale o supere el valor de hay en algún momento.