Сходу заметил недостатки. При каждом проходе обрабатывается только одно событие, хотя оба могут наступить одновременно. Что происходит со вторым событием? Оно сохраняется где-то в функции GetTimerEvent и обрабатывается на следующем проходе или попросту теряется?