У меня есть TTimer в моем приложении, который срабатывает каждые 2 секунды и вызывает мой обработчик событий HandleTimerEvent(). Функция HandleTimerEvent() изменяет общие ресурсы и может занять 10 секунд для выполнения перед возвратом. Кроме того, я вызываю Sleep() в обработчике событий, чтобы время от времени отказываться от процессора.Является ли обработчик события TTimer.OnTimer реентерабельным?
Я не уверен, как работает объект TTimer строителя C++, когда дело доходит до вызова событий, поэтому сценарий, который я только что объяснил, заставил меня думать, в частности, вызывает ли HandleTimerEvent() до того, как предыдущий вызов вернулся.
Вопрос сводится к нескольким вещам.
Включает ли объект TTimer события?
Может ли объект TTimer вызвать мой обработчик событий до того, как был возвращен предыдущий вызов?
+1 для отключения таймера. Чтобы продемонстрировать эффективность отключения таймера (или простое демонстрацию того, что может пойти не так, если вы этого не сделаете), покажите сообщение в обработчике таймера. Если вы не отключите таймер при входе, будут помещены сообщения. –
Вы также можете использовать булевский флаг для предотвращения повторного размещения в обработчике событий таймера, но отключение самого таймера намного проще. – dthorpe
См. Https://forums.embarcadero.com/thread.jspa?messageID=171751𩻧 для полезного класса TTimerGuard, класса RAII-типа для использования TTimer. Может потребоваться настроить использование FInterval в зависимости от вашей реализации. –