日程提醒
日程提醒功能终于实现了,之前总是出现提醒不稳定问题,现在终于解决啦,放于此处,供有需要的朋友参考
#region 日程监视事件
private void timer1_Tick(object sender,EventArgs e){
try
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(CommonClass.Path);
XmlNode clocks = xmldoc.SelectSingleNode("/root/clocks");
DateTime nowtime = DateTime.Now; //获取当前系统时间
foreach(XmlNode clock in clocks.ChildNodes)
{
string time = clock.ChildNodes[0].InnerText;
if(time == nowtime.ToString("HH:mm"))
{
string content = clock.ChildNodes[1].InnerText;
string repeat = clock.ChildNodes[2].InnerText;
CommonClass.currentclock = time; //保存最新的日程提醒时间
if(repeat == "单次")
{
CommonClass.deleteXML(time,content,repeat);
}
alarm a = new alarm(content, CommonClass.currentclock); //定义日程提示界面对象
a.Show(); //弹出日程提醒界面
timer1.Stop(); //暂停定时器,实现只弹出一个日程提醒框,否则会弹出60个
break;
}
}
}
catch
{
MessageBox.Show("日程提醒出现异常");
}
}
#endregion
- 2楼mdbsdn昨天 14:19
- 我做了个类似程序一到指定时间就弹出个提醒框,现在是一秒钟判断一次,但感觉效率不高,博主有什么好的办法改变下.....
- Re: mzbxzhdxmyb昨天 14:31
- 回复mdbsdnn这位朋友,你好,这个问题我已经解决了,但由于回复板的条件限制,不方便沟通,请加1634562626
- Re: mdbsdn昨天 15:46
- 回复mzbxzhdxmybn非常感谢博主的分享精神,上班不好上Q,博主不如再简单的再写一篇关于这个问题的博文,好让同样遇到这个问题的朋友们都能看到....
- Re: mzbxzhdxmyb昨天 15:55
- 回复mdbsdnn我暂时也是每秒判断一次,但每当完成一个日程提醒后暂停一分钟,一分钟后重新启动。但是这样频繁读取XML文档,我担心可能对硬盘会有所伤害,所以现在我就将XML与ArrayList结合起来,每次读取ArrayList中的内容而避免直接操作XML文档。正在考虑1楼朋友的建议
- 1楼zhoujielunzhimi昨天 15:41
- 日程提醒,对于简单的,可以一直tick,明显效率不高。如果一开始的时候就获取 距离日程时间还有多长,然后只tick一次(如果有多个,可以考虑第一个日程到达时,再去tick第二个),避免定时器一直tick。
- Re: mzbxzhdxmyb昨天 18:27
- 回复zhoujielunzhimin您好,按照这样的思路,我是这样想的:新增一个线程用来控制timer的开始,日程提醒后,将该线程sleep,睡眠时间为到下一个日程提醒的时间间隔(微小于它)。但是有一个问题是,新增的线程如何控制窗体中的timer?我在窗体加载事件中这样定义:nThreadStart start = new ThreadStart(this.StartTimer);nThread clock = new Thread(start);nclock.Start();nn在这个类中存在StartTimer方法,该方法内容为:n MessageBox.Show("clockStart"); //测试时可以实现n Thread.Sleep(3000);n MessageBox.Show("clockAgainStart"); //测试时可以实现n timer1.Enabled = true; //测试时不可以实现,即lbtime无内容显示nntimer的tick事件内容为:nlbtime.Text = DateTime.Now.ToString() + " " + DateTime.Now.DayOfWeek.ToString();nn不知道为什么无法控制窗体中的timer,不知道您是如何做的?
- Re: zhoujielunzhimi昨天 08:57
- 回复mzbxzhdxmybn不需要用线程。n比如有3个提醒,分别在10s,30s,55s,那么窗体加载后,定时10s,10s后弹出第一个提醒,再重新设置定时20s,如此。。。
- Re: mzbxzhdxmyb昨天 13:41
- 回复zhoujielunzhimin不知道动态改变timer的Interval是否可以实现?我来试试
- Re: mzbxzhdxmyb昨天 13:50
- 回复zhoujielunzhimin用户可以动态改变日程,即随时删除、随时增加、随时更改呢?
- Re: zhoujielunzhimi昨天 13:54
- 回复mzbxzhdxmybn动态改变timer的Interval,我就是这个意思。n比如有个Init函数用来获取第一个最近的日程提醒,然后开始定时。n动态删除或者增加后,禁止定时器,再调用Init。n当第一个定时到了之后,先禁用定时器,并且删除这个日程后再去Init
- Re: mzbxzhdxmyb昨天 14:02
- 回复zhoujielunzhimin谢谢你,功能实现啦,现在不需要每秒tick了,这个日程提醒功能是按照实际需求开发的,所以比较实用,谢谢!