I went into something similar recently, calling the same function from a timer when the previous one didn't finish. It caused an endless loop. I'd rather not say how long it took me to debug it, mainly because I thought it was in a completely different unit and task, until I discovered the loop running in a totally accidental way.
In short: always be sure that routines called from events are not running already. If it's from a button, then disable the button as soon as the onclick event procedure starts. If it's from a timer or similar, use some kind of global flag and don't call the routine it if the flag is enabled (and disable the flag when the function finishes). Exact implementation up to your tastes.
Sometimes it's harmless, other times it's not but you spot the problem quickly. But when you don't see it, specially with timers... Mayhem.
About checking the second every second, it might be as exact as just putting a timer on 60000. After all, the check is based on a timer, which is not guaranteed to be exact, p.e. if there's another function doing something long between calls to ProcessMessages. The timer on another thread might call the synchronize on an exact time, but IIRC that puts the call to the routine on the message queue, isn't it? so same problem. It would be good only if the code to be executed is in the timer thread.