c语言 - 在调用 SetTimer 以启动新的计时器后,在该计时器的 TimerProc 中调用 KillTimer 是否安全?



例如,我有以下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();
}

相关内容

  • 没有找到相关文章

最新更新