try一下,啥异常看看不就知道了用timer时注意,主线程操作时间超过了timer间隔时间时,则timer事件将被延后执行!
如主线程暂停30秒,则实际你的timer也会被延时30秒!

解决方案 »

  1.   

    看你的设计意图了如果你的每隔15秒是指不包括处理时间的话void AThread()
    {
        int milliStart = Environment.TickCount;
        while (True)
        {
            int milliEnd = Environment.TickCount;
            if (milliEnd - milliStart > 15000) // 15秒执行一次
            {
                // Do ...
                milliStart = Environment.TickCount; // 都执行完了重新开始计算
            }
        }
    }如果你的每隔15秒是指包括处理时间的话void AThread()
    {
        int milliStart = Environment.TickCount;
        while (True)
        {
            int milliEnd = Environment.TickCount;
            if (milliEnd - milliStart > 15000) // 15秒执行一次
            {
                // Do ...
                milliStart = milliEnd; // 如果上面的操作时间已经超过了15秒,
                                       // 意味着下一次循环判断milliEnd - milliStart的时候会立即成立而运行下一次操作了
            }
        }
    }
      

  2.   

    我已经判断过了  15秒不包括获取时间  获取前TIMER禁用  获取完启用  
      

  3.   


    你的主窗口的线程!我一看到while (True)代码就看不下去了...心晃
      

  4.   

    用的是 FROM的那个TIMER吧. vs2005?
    这TIMER好像有这么个bug 时间长了就完蛋换个timer
    用System.Timers.Timer
      

  5.   

    那可能是你的计时器消息被吃掉了,还是用我说的线程循环定时吧
    我哪本书看过,windows会在当消息队列里有4个还是几个WM_TIME时丢掉最早的WM_TIME以防止消息队列堵塞,因为系统也会产生很多计时消息,
    如果你的程序总是不能在15秒内完成运算或者电脑运行缓慢或病毒什么的,结果使得队列里排队的WM_TIME越来越多,然后最早的老被丢掉,
    最后的情况就是每次的第一个WM_TIME总是在被捕获前就被丢弃而后面继续在生成WM_TIME,因为你上次的操作没有完成,也就没机会运行到禁止计时器哪行代码但下次的时间又到了!,所以不是计时器的bug,是windows就是这么设计的
      

  6.   

    http://it.inhe.net/richbbs/2005/320/3209597.htm
    这篇论坛就讨论了这个问题,引用一下
    问题: 困惑,WM_TIMER消息的处理是阻塞的吗? ( 积分: 100 )
    分类: 系统相关
    来自: g_feng, 时间: 2005-09-18 17:22:00, ID: 3209597
    查了一些以前的帖子,最后的结论似乎都是WM_TIMER是阻塞的,因为它是基于窗口进程的,并没有多线程的处理。我自己也写了一个测试程序证明的确没有多线程。但有一个现象自己一直想不通,按道理模式对话框应该阻塞的,但是我在一个定时器的处理函数里弹出一个模式对话框它应该会阻塞住,那么当进程在这个函数没有处理完时,不应该再继续下面的处理,这样下一个定时器消息也不应该会处理,但情况是对话框会不断弹出,请问这应该怎么解释????来自: g_feng, 时间: 2005-09-18 18:02:35, ID: 3209614
    刚才查到一个关于这个问题的答案: 
    如果你是DoModal或者Create一个对话框或者其它有消息循环和响应的东东那你在消息队列里的消息就会被取出并且得到处理(GetMessage,TranslateMessage,DispatchMessage) 
    所以你的TIMER消息不会被阻挡 
    但是如果你在TIMER消息里是大量长时间的计算那你的消息就阻塞了,如果你用SLEEP试试就知道了,反过来说,如果你在这个长时间的计算中间用 
    BOOL bRet; 
    if( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) 

       if (bRet == -1) 
       { 
           // handle the error and possibly exit 
       } 
       else 
       { 
           TranslateMessage(&msg); 
           DispatchMessage(&msg); 
       } 

    这个,那么你的TIMER消息可能也会发生 
    关键在GetMessage其实你不用MFC你用WIN32做你就要写很多这些东西了!来自: billwillman, 时间: 2005-09-18 19:30:35, ID: 3209674
    WM_TIME消息为较弱的消息处理当操作系统比较忙的时候会丢弃消息队列中的WM_TIME消息, 
    WM_PAINT消息也一样
      

  7.   

    以前在2003下碰过类似问题,那时候写的是windows服务,也是运行一段时间后莫名其妙的停了或者不按照时间执行了
    好象是TIMER有问题,好象和垃圾回收机制也有关系吧,自己猜测,具体的不清楚……
    楼主可以试下用线程来搞,或者把一些变量设置成static
    可能会有效果
      

  8.   

    在windows服务里不能用拖控件后自动生成的那个timer