Advertisement
Guest User

Untitled

a guest
Feb 13th, 2017
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.33 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Windows.Forms;
  4. using System.ComponentModel;
  5. using Microsoft.Win32.SafeHandles;
  6. using System.Runtime.InteropServices;
  7.  
  8. namespace WakeUPTimer
  9. {
  10.     public class WaitableTimer
  11.     {
  12.         [DllImport("kernel32.dll")]
  13.         private static extern SafeWaitHandle CreateWaitableTimer(
  14.             IntPtr lpTimerAttributes,
  15.             bool bManualReset,
  16.             string lpTimerName);
  17.         [DllImport("kernel32.dll", SetLastError = true)]
  18.         [return: MarshalAs(UnmanagedType.Bool)]
  19.         private static extern bool SetWaitableTimer(
  20.             SafeWaitHandle hTimer,
  21.             [In] ref long pDueTime,
  22.             int lPeriod,
  23.             IntPtr pfnCompletionRoutine,
  24.             IntPtr lpArgToCompletionRoutine,
  25.             bool fResume);
  26.        
  27.         //public event EventHandler Woken;
  28.        
  29.         public WaitableTimer(TimeSpan delay)
  30.         {
  31.             WakeUP();
  32.             bgWorker.RunWorkerAsync(-delay.Ticks);
  33.         }
  34.         public WaitableTimer(DateTime wakeup_time)
  35.         {
  36.             WakeUP();
  37.             bgWorker.RunWorkerAsync(wakeup_time.Ticks);
  38.         }
  39.  
  40.         private BackgroundWorker bgWorker; // тот же Thread, только в профиль
  41.        
  42.         private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
  43.         {
  44.             long waketime=(long)e.Argument;
  45.             using (SafeWaitHandle handle=CreateWaitableTimer(
  46.                 IntPtr.Zero,true,this.GetType().Assembly.GetName().Name.ToString()+"MyWaitableTimer"))
  47.             {
  48.                 if (SetWaitableTimer(handle,ref waketime,0,IntPtr.Zero,IntPtr.Zero,true))
  49.                 {
  50.                     using (EventWaitHandle wh=new EventWaitHandle(false,EventResetMode.AutoReset))
  51.                     {
  52.                         wh.SafeWaitHandle=handle;
  53.                         wh.WaitOne();
  54.                     }
  55.                 } else
  56.                 {
  57.                     //throw new Win32Exception(Marshal.GetLastWin32Error());
  58.                     Exception error=new Win32Exception(Marshal.GetLastWin32Error());
  59.                     MessageBox.Show("Что то пошло не так ...\r\n\r\n"+error.Message,"Ой ...");
  60.                 }
  61.             }
  62.         }
  63.         /*private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  64.         {
  65.             /* if (Woken!=null)
  66.                 Woken(this,new EventArgs());
  67.             else {}
  68.             MessageBox.Show("Интересна ...","Хм ...");
  69.         }*/
  70.         private void WakeUP()
  71.         {
  72.             if (bgWorker==null)
  73.             {
  74.                 bgWorker=new BackgroundWorker();
  75.                 bgWorker.DoWork+=new DoWorkEventHandler(bgWorker_DoWork);
  76.             } else {}
  77.             //bgWorker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
  78.         }
  79.  
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement