您的位置:首页 > 其它

关于闹钟程序的思考

2014-03-22 00:05 197 查看
有一次晚上睡觉,要设手机的闹钟。可是手机没电关机了。这时充电器又找不到了。无法设闹钟,但第二天要8点起床去上班。于是就想着自己用电脑写个闹钟程序。设计思路是,做个循环,每秒获取一次当前系统时间,并判断是否为早上八点。如果是,就播放一点音乐。

下面是代码:

PSYSTEMTIME pTime = (PSYSTEMTIME)malloc(sizeof(SYSTEMTIME));
GetLocalTime(pTime);
printf("time is: %d: %d: %d \n",pTime->wHour,pTime->wMinute,pTime->wSecond);
while(TRUE)
{
Sleep(1000);
GetLocalTime(pTime);
printf("time is: %d: %d: %d  \n",pTime->wHour,pTime->wMinute,pTime->wSecond);
if (pTime->wHour == 8 && pTime->wMinute == 21 && pTime->wSecond == 0)
{
ShellExecute(NULL,0,L"c:\\宋祖英 - 十送红军.mp3",NULL,0,SW_HIDE);
break;
}
}

free(pTime);


设了一个时间,编译测试了一下,还算靠谱。到预期的时间果然放出了音乐。于是我就把时间设成早上八点,让程序一直运行着。然后自己就睡了。

可是第二天,直到我八点多睡醒,音乐一直没播放。一看电脑,处于休眠状态。我点了一下鼠标,系统恢复了。看到程序还在那循环,并没有把八点的那个时刻判断成功。当时很郁闷。

后来把这件事告诉同学。他听了之后说,系统休眠你的进程就挂起了。当你重新把系统恢复的时候,进程是继续运行了。但此时已经是八点多了。我一听,觉得是这个道理。可什么方法能让进程在挂起的状态下还能判断出时间,并让进程恢复呢。

后来我发现了SetWaitableTimer()这个函数。是一个等待计时器。如果把最后一个参数设为TRUE,当进程在挂起时,计时器被触发,进程会被唤醒。于是我就用这个函数又写了一个程序。代码如下:

HANDLE hTimer;
SYSTEMTIME st;
FILETIME ftLocal, ftUTC;
LARGE_INTEGER liUTC;

hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

st.wYear = 2014;
st.wMonth = 3;
st.wDay = 21;
st.wDayOfWeek = 0;
st.wHour = 8;
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;

SystemTimeToFileTime(&st, &ftLocal);

LocalFileTimeToFileTime(&ftLocal, &ftUTC);
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;

if (!SetWaitableTimer(hTimer, &liUTC, 0, NULL, NULL, TRUE))
{
printf("SetWaitableTimer failed (%d)\n", GetLastError());
return 2;
}

if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
printf("WaitForSingleObject failed (%d)\n", GetLastError());
else
ShellExecute(NULL,0,L"c:\\宋祖英 - 十送红军.mp3",NULL,0,SW_HIDE);


设置时间,经过测试。看似也靠谱。于是把时间又设成是早上八点。然后让电脑跑了一夜。第二天早上,果然在早上八点准时播放了十送红军。

看来方法还是有的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: