关于闹钟程序的思考
2014-03-22 00:05
197 查看
有一次晚上睡觉,要设手机的闹钟。可是手机没电关机了。这时充电器又找不到了。无法设闹钟,但第二天要8点起床去上班。于是就想着自己用电脑写个闹钟程序。设计思路是,做个循环,每秒获取一次当前系统时间,并判断是否为早上八点。如果是,就播放一点音乐。
下面是代码:
设了一个时间,编译测试了一下,还算靠谱。到预期的时间果然放出了音乐。于是我就把时间设成早上八点,让程序一直运行着。然后自己就睡了。
可是第二天,直到我八点多睡醒,音乐一直没播放。一看电脑,处于休眠状态。我点了一下鼠标,系统恢复了。看到程序还在那循环,并没有把八点的那个时刻判断成功。当时很郁闷。
后来把这件事告诉同学。他听了之后说,系统休眠你的进程就挂起了。当你重新把系统恢复的时候,进程是继续运行了。但此时已经是八点多了。我一听,觉得是这个道理。可什么方法能让进程在挂起的状态下还能判断出时间,并让进程恢复呢。
后来我发现了SetWaitableTimer()这个函数。是一个等待计时器。如果把最后一个参数设为TRUE,当进程在挂起时,计时器被触发,进程会被唤醒。于是我就用这个函数又写了一个程序。代码如下:
设置时间,经过测试。看似也靠谱。于是把时间又设成是早上八点。然后让电脑跑了一夜。第二天早上,果然在早上八点准时播放了十送红军。
看来方法还是有的。
下面是代码:
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);
设置时间,经过测试。看似也靠谱。于是把时间又设成是早上八点。然后让电脑跑了一夜。第二天早上,果然在早上八点准时播放了十送红军。
看来方法还是有的。
相关文章推荐
- 关于效率、程序与生活的一些思考
- 关于前两天的一个比较复杂的程序逻辑的思考
- 程序思考2: 关于“框架”
- 关于buffer overflow detected 程序崩溃的思考
- ios-通知:闹钟之关于设置闹钟后,点击app图标进入程序不播放音乐的问题(已解决)
- 关于程序人生的些许思考...
- 关于程序工作者的规划与思考
- 关于plugin 程序 动态卸载 plugin 的思考
- 关于解决商务平台ASP程序的源代码泄漏设想与思考
- 关于程序维护、修改的一点迷惑和思考
- 《深入理解计算机系统》读书笔记3---关于程序运行的思考
- 关于程序工作者的规划与思考
- 关于写程序的思考
- 【程序思考】关于“乐道”的改版和未来
- 关于微信小程序的几点思考
- 关于独立按键扫描程序的思考(整合两种算法)
- 【程序思考】关于“乐道”的改版和未来
- 关于程序的一些零碎思考
- 关于程序的运算时间复杂度的一点思考
- 【程序思考】 关于“框架”