在调用SetTimer启动一个新的计时器后,我在该计时器的TimerProc中调用KillTimer是否安全?

w9apscun  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(169)

例如,假设我有以下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()仍然会被调用吗?

vxf3dgd4

vxf3dgd41#

这段代码是否会成功终止计时器IDT_TIMER1
是的。
我在计时器过程本身中调用KillTimer这一事实是否会带来问题?
不可以。在定时器回调中调用KillTimer是完全安全的。
函数DoTimerTask()还会被调用吗?
是的,因为你在再次调用DoTimerTask()之前没有从回调中调用return,例如:

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();
}

相关问题