例如,我有以下TimerProc
:
#include <Windows.h>
#define IDT_TIMER1 1001
BOOL g_fKillTimer = FALSE;
VOID DoTimerTask(); // Among other things, sets the flag `g_fKillTimer` when needed
// Timer is started elsewhere with a call to:
// SetTimer(hWnd, IDT_TIMER1, 10000, TimerProc);
VOID CALLBACK TimerProc(
_In_ HWND hWnd,
_In_ UINT uMsg,
_In_ UINT_PTR idEvent,
_In_ DWORD dwTime
)
{
if (TRUE == g_fKillTimer)
{
KillTimer(hWnd, IDT_TIMER1);
g_fKillTimer = FALSE;
}
DoTimerTask();
}
这段代码会成功杀死定时器IDT_TIMER1
吗?或者我在计时器过程中调用KillTimer
本身可能会出现问题吗?函数DoTimerTask()
还会被调用吗?
这段代码会成功杀死定时器
IDT_TIMER1
吗?
是的。
是事实,我调用
KillTimer
在定时器过程本身可能会提出一个问题?
。在计时器回调中调用KillTimer
是完全安全的。
函数
DoTimerTask()
还会被调用吗?
是的,因为你在再次调用DoTimerTask()
之前没有从回调return
'ing,例如:
VOID CALLBACK TimerProc(
_In_ HWND hWnd,
_In_ UINT uMsg,
_In_ UINT_PTR idEvent,
_In_ DWORD dwTime
)
{
if (TRUE == g_fKillTimer)
{
KillTimer(hWnd, IDT_TIMER1);
g_fKillTimer = FALSE;
return; // <-- HERE
}
DoTimerTask();
}