Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Threading;
- using System.Windows.Forms;
- using System.ComponentModel;
- using Microsoft.Win32.SafeHandles;
- using System.Runtime.InteropServices;
- namespace WakeUPTimer
- {
- public class WaitableTimer
- {
- [DllImport("kernel32.dll")]
- private static extern SafeWaitHandle CreateWaitableTimer(
- IntPtr lpTimerAttributes,
- bool bManualReset,
- string lpTimerName);
- [DllImport("kernel32.dll", SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- private static extern bool SetWaitableTimer(
- SafeWaitHandle hTimer,
- [In] ref long pDueTime,
- int lPeriod,
- IntPtr pfnCompletionRoutine,
- IntPtr lpArgToCompletionRoutine,
- bool fResume);
- //public event EventHandler Woken;
- public WaitableTimer(TimeSpan delay)
- {
- WakeUP();
- bgWorker.RunWorkerAsync(-delay.Ticks);
- }
- public WaitableTimer(DateTime wakeup_time)
- {
- WakeUP();
- bgWorker.RunWorkerAsync(wakeup_time.Ticks);
- }
- private BackgroundWorker bgWorker; // тот же Thread, только в профиль
- private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
- {
- long waketime=(long)e.Argument;
- using (SafeWaitHandle handle=CreateWaitableTimer(
- IntPtr.Zero,true,this.GetType().Assembly.GetName().Name.ToString()+"MyWaitableTimer"))
- {
- if (SetWaitableTimer(handle,ref waketime,0,IntPtr.Zero,IntPtr.Zero,true))
- {
- using (EventWaitHandle wh=new EventWaitHandle(false,EventResetMode.AutoReset))
- {
- wh.SafeWaitHandle=handle;
- wh.WaitOne();
- }
- } else
- {
- //throw new Win32Exception(Marshal.GetLastWin32Error());
- Exception error=new Win32Exception(Marshal.GetLastWin32Error());
- MessageBox.Show("Что то пошло не так ...\r\n\r\n"+error.Message,"Ой ...");
- }
- }
- }
- /*private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- /* if (Woken!=null)
- Woken(this,new EventArgs());
- else {}
- MessageBox.Show("Интересна ...","Хм ...");
- }*/
- private void WakeUP()
- {
- if (bgWorker==null)
- {
- bgWorker=new BackgroundWorker();
- bgWorker.DoWork+=new DoWorkEventHandler(bgWorker_DoWork);
- } else {}
- //bgWorker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement