准备做一个如下功能的程序:程序后台运行,在固定时间(比如12:30)用MessageBox弹个对话框,如此而已。我的思路有两个:
1、用Timer,以一定频率GetLocalTime,判断是否是12:30分,是的话就MessageBox。
2、用do while(1)循环,循环中Sleep一定的时间,再GetLocalTime,再判断,再MessageBox。
感觉两种方法都不够节省资源,不知各位大侠有什么高招可以优化一下,以节省CPU或内存。
比如:1、有没有现成的或相关的API可以调用?
2、程序优先级设置为哪个级别比较合适?等等。希望大家能不吝笔墨,阐述得详尽点。谢谢!

解决方案 »

  1.   

    Using Timer Queues
    The following example creates a timer routine that will be executed by a timer-queue thread after a 10 second delay. First, the code uses the CreateEvent function to create an event object that is signaled when the timer-queue thread completes. Then it creates a timer queue and a timer-queue timer, using the CreateTimerQueue and CreateTimerQueueTimer functions, respectively. The code uses the WaitForSingleObject function to determine when the timer routine has completed. Finally, the code calls DeleteTimerQueue to clean up.
    For more information on the timer routine, see WaitOrTimerCallback.
    #define _WIN32_WINNT 0x0500#include <windows.h>
    #include <stdio.h>HANDLE gDoneEvent;VOID CALLBACK TimerRoutine(PVOID lpParam, BOOL TimerOrWaitFired)
    {
        if (lpParam == NULL)
        {
            printf("TimerRoutine lpParam is NULL\n");
        }
        else
        {
            // lpParam points to the argument; in this case it is an int        printf("Timer routine called. Parameter is %d.\n", 
                    *(int*)lpParam);
        }    SetEvent(gDoneEvent);
    }int main()
    {
        HANDLE hTimer = NULL;
        HANDLE hTimerQueue = NULL;
        int arg = 123;    // Use an event object to track the TimerRoutine execution
        gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (!gDoneEvent)
        {
            printf("CreateEvent failed (%d)\n", GetLastError());
            return 1;
        }    // Create the timer queue.
        hTimerQueue = CreateTimerQueue();
        if (!hTimerQueue)
        {
            printf("CreateTimerQueue failed (%d)\n", GetLastError());
            return 2;
        }    // Set a timer to call the timer routine in 10 seconds.
        if (!CreateTimerQueueTimer(
            &hTimer, hTimerQueue, TimerRoutine, &arg , 10000, 0, 0))
        {
            printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
            return 3;
        }    // TODO: Do other useful work here     printf("Call timer routine in 10 seconds...\n");    // Wait for the timer-queue thread to complete using an event 
        // object. The thread will signal the event at that time.    if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0)
            printf("WaitForSingleObject failed (%d)\n", GetLastError());    // Delete all timers in the timer queue.
        if (!DeleteTimerQueue(hTimerQueue))
            printf("DeleteTimerQueue failed (%d)\n", GetLastError());    return 0;
    }
      

  2.   

    不过就你的方法,本身也消耗不了多少CPU资源呀!
      

  3.   

    呵呵,看着任务管理器内存使用达到4位数,我就不爽。
    你的方法是MSDN上摘的吧?你能不能解释一下 Timer Queues的机理和我所说的两个方法的本质区别呢?
    谢谢
      

  4.   

    不用这么复杂吧,只要算出需要Sleep多少时间比方程序运行时是8:00, 下一个任务是12:00,那么这次直接Sleep 4个小时就可以了,下次wake时是12:00,然后再看下一个任务,比方12:05,那么算出需要Sleep 5分钟,于是继续SleepSleep几乎不占系统资源,所以....
      

  5.   

    程序优先级设置为Normal就可以了
      

  6.   

    首先感谢大家的回答。我想具体问题具体分析,Timer大部分情况下比Sleep好用,又方便精度也比低优先级的Sleep高,但是对一个功能如此简单的程序,Sleep比Timer占用的cpu要少的。(个人经验感觉,没有权威根据)。
        to tiaoci(我挑刺,我快乐)
    你的方法虽然有缺陷,Sleep在长时间sleep后获得cpu是无法保证,尤其是在低优先级的情况下,所以精度会比较差,但是创意实在不错,很只得学习,借鉴。
      

  7.   

    考虑下CreateWaitableTimer以及SetWaitableTimer.