public static bool TimersSupported() { IntPtr timerHandle = CreateWaitableTimer(IntPtr.Zero, true, "Wait Timer 1"); long interval = 0; int retVal = 0; if (timerHandle != IntPtr.Zero) { TimerCompleteDelegate TimerComplete = new TimerCompleteDelegate(TimerCompleted); SetWaitableTimer(timerHandle, ref interval, 0, TimerComplete, IntPtr.Zero, true); retVal = Marshal.GetLastWin32Error(); CancelWaitableTimer(timerHandle); try { CloseHandle(timerHandle); } catch (Exception exp) { } timerHandle = IntPtr.Zero; } //SUCCESS if (retVal == 0) { return(true); } else { return(false); } }
public static IntPtr SetWakeAt(DateTime dt) { TimerCompleteDelegate timerComplete = null; // read the manual for SetWaitableTimer to understand how this number is interpreted. long interval = dt.ToFileTimeUtc(); IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer"); SetWaitableTimer(handle, ref interval, 0, timerComplete, IntPtr.Zero, true); return(handle); }
private IntPtr SetWakeAt(DateTime dt) { // read the manual for SetWaitableTimer to understand how this number is interpreted. // long interval = dt.ToFileTimeUtc(); TimerCompleteDelegate timerComplete = null; // long interval = -100000000L; long interval = dt.ToFileTime(); IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer"); bool erg = SetWaitableTimer(handle, ref interval, 0, timerComplete, IntPtr.Zero, true); DisplayBallonMessage("Wakeup @: " + dt.ToString(), 10000); return(handle); }
public static bool CreateTimer() { DateTime utc = DateTime.Now.AddMinutes(2); long Interval = utc.ToFileTime(); TimerCompleteDelegate TimerComplete = new TimerCompleteDelegate(TimerCompleted); TimerSetDelegate TimerSet = new TimerSetDelegate(TimerIsSet); // Creating the timer // Console.WriteLine("Creating WaitableTimer"); IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer"); int retVal = Marshal.GetLastWin32Error(); Console.WriteLine("Last Error = " + retVal.ToString()); if (retVal != 0) { return(false); } // Setting up the timer, the long Interval value needs to be negative if // you want to set up a delay in milliseconds. ie // if Interval = -60000000 the timer will expire in 1 minute. Once expired it runs the // TimerComplete delegate // Console.WriteLine("Setting WaitableTimer"); SetWaitableTimer(handle, ref Interval, 0, TimerComplete, IntPtr.Zero, true); retVal = Marshal.GetLastWin32Error(); Console.WriteLine("Last Error = " + Marshal.GetLastWin32Error().ToString()); // The error may be 1004 (Invalid flags), this is not critical if (retVal != 0 && retVal != 1004) { return(false); } Console.WriteLine("Timer set @ " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); // Starting a new thread which waits for the WaitableTimer to expire // Thread t_Wait = new Thread(new ThreadStart(() => WaitTimer(handle))); t_Wait.Start(); // Raising Event Timer Set // if (OnTimerSet != null) { OnTimerSet(); } return(true); }
/// <summary> /// 延迟 /// </summary> /// <param name="time">单位毫秒</param> public static bool Sleep(int time) { TimerCompleteDelegate TimerComplete = new TimerCompleteDelegate(TimerCompleted); long Interval = -10 * time * 1000;//占8字节 //创建计时器 IntPtr handle = CreateWaitableTimer(IntPtr.Zero, true, "WaitableTimer"); SetWaitableTimer(handle, ref Interval, 0, TimerComplete, IntPtr.Zero, true); //等待消息抵达 while (MsgWaitForMultipleObjects(1, ref handle, false, -1, 255) != 0) { //转让权限 Application.DoEvents(); } return(CloseHandle(handle)); }
public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref LARGE_INTEGER ft, int lPeriod, TimerCompleteDelegate pfnCompletionRoutine, IntPtr pArgToCompletionRoutine, bool fResume);
private static extern bool SetWaitableTimer(SafeWaitHandle hTimer, [In] ref long pDueTime, int lPeriod, TimerCompleteDelegate pfnCompletionRoutine, IntPtr lpArgToCompletionRoutine, bool fResume);