关于闹钟程序的思考

有一次晚上睡觉,要设手机的闹钟。可是手机没电关机了。这时充电器又找不到了。无法设闹钟,但第二天要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);



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

看来方法还是有的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值