Tengo un TTimer en mi aplicación que se dispara cada 2 segundos y llama a mi controlador de eventos, HandleTimerEvent(). La función HandleTimerEvent() modifica los recursos compartidos y puede tardar 10 segundos en ejecutarse antes de volver. Además, llamo a Sleep() en el controlador de eventos para renunciar al procesador a veces.¿Está el reentrante del controlador de eventos TTimer.OnTimer?
No estoy seguro de cómo funciona el objeto TTimer del generador de C++ cuando se trata de llamar eventos, por lo que el escenario que acabo de explicar me hace pensar, particularmente, si se llama a HandleTimerEvent() antes de que se devuelva una llamada anterior.
La pregunta se reduce a un par de cosas.
¿El objeto TTimer pone en cola los eventos?
¿Puede el objeto TTimer llamar a mi controlador de eventos antes de que haya respondido una llamada anterior?
+1 para deshabilitar el temporizador. Para demostrar la efectividad de deshabilitar el temporizador (o una demostración fácil de lo que puede salir mal si no lo hace), muestre un cuadro de mensaje en el controlador del temporizador. Si no desactiva el temporizador al ingresar, los cuadros de mensajes se acumularán. –
También puede usar un indicador booleano para evitar la reentrada en el controlador de eventos del temporizador, pero deshabilitar el temporizador en sí es mucho más simple. – dthorpe
Consulte https://forums.embarcadero.com/thread.jspa?messageID=171751𩻧 para obtener una clase TTimerGuard útil, una clase de estilo RAII para el uso de TTimer. Puede ser necesario ajustar el uso de FInterval según su implementación. –