我在我的应用程序中有一个TTimer,每2秒触发一次并调用我的事件处理程序HandleTimerEvent()。 HandleTimerEvent()函数修改共享资源,并且在返回之前可能需要10秒才能执行。此外,我在事件处理程序中调用Sleep()以便有时放弃处理器。TTimer.OnTimer事件处理程序是否可重入?
我不确定C++ builder的TTimer对象在调用事件时是如何工作的,所以我刚刚解释的场景让我想到了,特别是在事先调用返回之前是否调用HandleTimerEvent()。
这个问题归结为几件事情。
TTimer对象是否排队事件?
在先前调用返回之前,TTimer对象可以调用我的事件处理程序吗?
+1用于禁用定时器。为了演示禁用定时器的有效性(或简单演示如果不这样做会出错),请在定时器处理程序中显示一个消息框。如果您在进入时不禁用定时器,则消息框将叠加起来。 – 2010-07-22 18:26:44
您也可以使用布尔标志来防止定时器事件处理程序中的重入,但禁用定时器本身要简单得多。 – dthorpe 2010-07-22 21:23:21
请参阅https://forums.embarcadero.com/thread.jspa?messageID=171751𩻧以获取有用的TTimerGuard类,TTimer使用的RAII风格类。可能需要根据您的实施情况调整FInterval使用情况。 – 2011-01-27 17:04:50