- you can specify a delay
- it returns a kernel handle you can wait on
- it allows pasing context data pointer to a callback function
- waitable timers are much more accurate as they are not calculated during idle and messages aren’t collapsed
- you can adjust the parameters of the timer with SetWaitableTimer and cancel it with CancelWaitableTimer..