Thats because timers are set-up by the OS...you use waitimer or delay and the OS will stop executeing your program and only return once the timer/deley event has occured....useing VWait means your program enters a loop where it checks the VWait refresh flag, if it has refreshed it exits the loop, if not it checks again...and again...and again untill the flag has been set...during this your program has 100% control of the CPU....but during a waittmer/delay...your program gives up CPU control to the OS, and the OS only returns CPU control to the program once it senses the correct time has elapsed.