2016-03-24 15 views
2

Ich versuche, meinen PC aufzuwecken, falls er in den Schlafmodus geraten ist. Ich habe dieses Code-Snippet auf einer Website gefunden, aber die Messagebox, die ich am Ende hinzugefügt habe, kommt immer sofort zurück.WaitForSingleObject sofort signalisiert

Ich habe auch mein System für die Verwendung von Weckern in den Stromoptionen aktiviert.

[DllImport("kernel32.dll")] 
    public static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes, 
    bool bManualReset, string lpTimerName); 

    [DllImport("kernel32.dll")] 
    public static extern bool SetWaitableTimer(IntPtr hTimer, [In] ref long 
    pDueTime, int lPeriod, IntPtr pfnCompletionRoutine, IntPtr 
    lpArgToCompletionRoutine, bool fResume); 

    [DllImport("kernel32", SetLastError = true, ExactSpelling = true)] 
    public static extern Int32 WaitForSingleObject(IntPtr handle, uint 
    milliseconds); 

    static IntPtr handle; 

    private void SetWaitForWakeUpTime() 
    { 
     long duetime = 1200000000; 
     handle = CreateWaitableTimer(IntPtr.Zero, true, "MyWaitabletimer"); 
     SetWaitableTimer(handle, ref duetime, 0, IntPtr.Zero, IntPtr.Zero, true); 
     uint INFINITE = 0xFFFFFFFF; 
     int ret = WaitForSingleObject(handle, INFINITE); 
     MessageBox.Show("wake up !"); 
    } 

und ich es so nennen:

private void buttonTest_Click(object sender, EventArgs e) 
    { 
     SetWaitForWakeUpTime(); 
    } 

Theoretisch sollte dies erst nach 2 Minuten signalisiert wird, nicht wahr? Warum wird es sofort signalisiert und wie korrigiere ich es?

Antwort

2

SetWaitableTimer() kann sowohl eine absolute als auch eine inkrementelle Zeit auslösen. Aus dem MSDN-Artikel:

pDueTime [in]
Die Zeit, nach der der Zustand des Timer signalisiert, in 100 ns Intervallen zu setzen ist. Verwenden Sie das von der FILETIME-Struktur beschriebene Format. Positive Werte zeigen absolute Zeit. Stellen Sie sicher, dass Sie eine UTC-basierte absolute Zeit verwenden, da das System intern die UTC-basierte Zeit verwendet. Negative Werte zeigen die relative Zeit an. Die tatsächliche Timer-Genauigkeit hängt von der Leistungsfähigkeit Ihrer Hardware ab. Weitere Informationen zur UTC-basierten Zeit finden Sie unter Systemzeit.

Sie haben jetzt einen positiven Wert verwendet, also haben Sie ein Datum im Jahr 1600 angegeben, das wird immer sofort abgeschlossen. Sieht so aus, als ob Ihre eigentliche Absicht darin besteht, ein 2-minütiges Intervall zu verwenden, also müssen Sie einen negativen Wert verwenden, -1200000000.

Wahrscheinliche wahre Absicht ist es zu einem bestimmten Zeitpunkt auf der Uhr aufwachen zu machen, das Nutzungsszenario gegeben, verwenden DateTime.ToUniversalTime(). ToFileTime()

+0

Ihnen sehr danken. Warum sollte jemand einen positiven Wert brauchen? Wer braucht eine Zeit im Jahr 1600? Ich denke, ich verstehe die eigentliche Bedeutung der absoluten Zeit nicht ganz ... – Lesic