准备做一个如下功能的程序:程序后台运行,在固定时间(比如12:30)用MessageBox弹个对话框,如此而已。我的思路有两个:
1、用Timer,以一定频率GetLocalTime,判断是否是12:30分,是的话就MessageBox。
2、用do while(1)循环,循环中Sleep一定的时间,再GetLocalTime,再判断,再MessageBox。
感觉两种方法都不够节省资源,不知各位大侠有什么高招可以优化一下,以节省CPU或内存。
比如:1、有没有现成的或相关的API可以调用?
2、程序优先级设置为哪个级别比较合适?等等。希望大家能不吝笔墨,阐述得详尽点。谢谢!
1、用Timer,以一定频率GetLocalTime,判断是否是12:30分,是的话就MessageBox。
2、用do while(1)循环,循环中Sleep一定的时间,再GetLocalTime,再判断,再MessageBox。
感觉两种方法都不够节省资源,不知各位大侠有什么高招可以优化一下,以节省CPU或内存。
比如:1、有没有现成的或相关的API可以调用?
2、程序优先级设置为哪个级别比较合适?等等。希望大家能不吝笔墨,阐述得详尽点。谢谢!
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;
}
你的方法是MSDN上摘的吧?你能不能解释一下 Timer Queues的机理和我所说的两个方法的本质区别呢?
谢谢
to tiaoci(我挑刺,我快乐)
你的方法虽然有缺陷,Sleep在长时间sleep后获得cpu是无法保证,尤其是在低优先级的情况下,所以精度会比较差,但是创意实在不错,很只得学习,借鉴。