正在写一个提醒软件。现有一个问题我一直没有想出好的解决方法。特来此问问高手们。
关于提醒事件的触发问题。最直接的方法是在Timer的Timer事件中一直检测。如果发现有
发期的事件就进行提醒。但这样做效率极为不高。会很占用系统的资源。
另一个方法是:一次把今天可能要进行提醒的事情都取出来。存放到本地,这样就不用
频繁的进行数据库的查询了。但是还是要不断的进行循环检测。
不知道大家是怎么解决的。高分相送。

解决方案 »

  1.   

    与自己用线程来实现相比, 用Timer是效率很高的方法, 且非常容易实现。
      

  2.   

    用timer吧
    如果时间精度要求不高可以把interval属性设得高点
      

  3.   

    真的一定要在timer
    中不停的与数据库进行查询吗?想不明白。
      

  4.   

    to : yimily(yimily)
    能具体 些吗?
      

  5.   

    对于简单的提醒还可以。
    提醒方式:一次性、每天、每周(分为七天,让用户进行多选)、每月、每年。
    对于以上的多种提醒方式,在进行比较的时候是有些繁琐的。
    另外问一下。这样的功能,大家是如果存储到数据库中的。to:ten_years_ago(昨天上班,今天下岗)
    能不能具体一些,大体上的思路就行。
      

  6.   

    一次得到所有的时间
    排序所有时间按时间间隔设定定时器
    如果上一个激发事件为 2005-01-01 10:00:00
    下一个激发事件为 2005-01-01 11:00:00
    则定时器的interval 就变成 60 * 60 * 1000
    这样定时器不会运行那么多次了
    其实,一分钟一次的定时器也占不了什么资源
      

  7.   

    to ; warmworm(warmworm) 
    你讲的也有道理。
      

  8.   

    进程+消息机制:   进程,你单独写一个程序,在这个进程中设一个Timer,让他在后台运行,调度交给WINDOWS好了;这样不会影响的主程序的.
       一旦有事件触发,例如Windwos的消息机制,由后台程序向你的主程序发一个相应的消息,这时主程序会自动按照你事先写好的处理模块去运行.这样做的效率是很高的,无论你Timer设成什么值,不会影响你的主程序运行.  注意点:1:每次启动主程序,先杀死后台进程(防止多个相同的后台进程存成),然后立该现加栽后台进程,向后台进程传递相应参数(例如:主程序的句柄,你的连接句柄等),同时记下后以进程的句柄,以便相互交换数据.   我在一个实时通讯串口通讯系统中,例如此方法,效率非常高,且非常稳定. 祝楼主成功.
      

  9.   

    使用间隔时间不是很短的定时器, 是不会产生什么效率的问题的。运行在Windows中的很多程序都使用了定时器。比如:你运行了QQ之后,QQ创建的"Game<->QQ Exchange Dlg"和"TE-Oicq Receive Dlg"两个Dialog中都有一个定时间隔为1秒的定时器。
      

  10.   

    使用间隔时间不是很短的定时器, 是不会产生什么效率的问题的。运行在Windows中的很多程序都使用了定时器。比如:你运行了QQ之后,QQ创建的"Game<->QQ Exchange Dlg"和"TE-Oicq Receive Dlg"两个Dialog中都有一个定时间隔为1秒的定时器。============================================
    这个观点不正确,qq以及其类似的程序,人家是采用了:线程或进程技术,如果单纯的用一个TIMER想解决问题,这种系统是验受不住考验的.
      

  11.   

    ten_years_ago(昨天上班,今天下岗) 说得有道理,如果只用一个程序长期贮留在内存的话,会点很多内存,不但因为有Timer 占CPU,而且占内存。使用Windows的消息机制是最好的方法了。
      

  12.   

    其实的确没有那么复杂,这是一个很多程序都使用的功能,Timer其实就会创建一个线程,这样的效率和自己写的多线程可能并没有什么差别,你当然可以自己写一个线程。讨论是好事情,大家都有很高级的方法,但也的确没必要想的太多不要怀疑你CPU的能力,而应该重视的是I/O和数据连接,数据连接是一种很宝贵的资源,不断的请求数据库当然是不行的,将数据提取到内存中,采用合适的数据组织方式,想最快当然是HASH表(不过我觉得也不是很必要),在线程中从内存中取出合适的数据就可以了
      

  13.   

    To ten_years_ago(昨天上班,今天下岗):
    这个观点不正确,qq以及其类似的程序,人家是采用了:线程或进程技术,如果单纯的用一个TIMER想解决问题,这种系统是验受不住考验的.TIMER是利用Windows自身的线程来实现, 肯定比你自己另外写线程更为简捷而可靠。
    在大绝大多数的应用中,除非需要精度较高的定时器,是没有必须自己来写线程来实现TIMER功能的。TIMER有TIMER最适合解决的问题,线程有线程最适合解决的问题,不能一概而论,不能认为所有问题都是应该用线程来解决。这种观点是错误的。