我用 SetTimer() 设定了一个定时器,
在 Debug 版本中没有问题。但是在 Release 版本中,无论我是在视图类的释构函数中调用
KillTimer(), 还是在 OnDestroy() 函数中 KillTimer(),
都有异常!!

解决方案 »

  1.   

    如果是那个窗口上的TIMER 就没有必要KILL掉
      

  2.   

    但是,如果不用 KillTimer() 的话在发行版中就有异常,
    而且是微软自己的 wincore.cpp 文件产生的。
    如果在一个按钮函数中先 KillTimer(), 再退出窗口,程序就正常了。奇诡是debug版本无论是销毁不销毁定时器退出,都没问题!!!
      

  3.   

    在哪里释放都一样!!!
    问题是的,如果我只在OnTimer()中做简单的事情就没问题。
    如果向窗口输出一个字符串。但是我的程序是向串口读取信息,
    都到东西后再用 PostMessage() 向主窗口发送一个消息来处理硬件接收到的信息。
      

  4.   

    KillTimer只是停止发送WM_TIMER消息,但是已经发送了的WM_TIMER消息是不会自动从消息队列里清除掉的
      

  5.   

    "KillTimer只是停止发送WM_TIMER消息,
    但是已经发送了的WM_TIMER消息是不会自动从消息队列里清除掉的"
    >>>>>>>>>>>
    具体应该怎么处理呢?微软的例子也是只是在 OnDestroy 中调用:
    KillTimer()
      

  6.   

    嗯,你需要在关闭之前停止发送新的自定义消息(比如在PostMessage或者处理WM_TIMER之前判断一下是否已经收到WM_DESTROY了),然后把应该处理的消息都处理完,再调用基类的OnDestroy。必要的时候,你可以直接访问消息队列,或者再启动一个消息循环。
      

  7.   

    不行!我早就试过了,
    即使是我的另外一个模块--负责通讯的,
    完全不发送消息,情况也完全一样。目前,唯一安全退出的途径是用一个按钮将Timer销毁,
    再关主窗口,这样就不会有任何异常。
      

  8.   

    to:robinswan
    但是,如果不用 KillTimer() 的话在发行版中就有异常,
    而且是微软自己的 wincore.cpp 文件产生的。
    如果在一个按钮函数中先 KillTimer(), 再退出窗口,程序就正常了。
    奇诡是debug版本无论是销毁不销毁定时器退出,都没问题!!!
    ——————————————————————————————————————————我个人认为计时器是一个系统资源,在一个程序中若不用时应该用KillTimer()删除,但在程序退出时,MFC的程序应能自动清除;按你的描述请仔细核对SetTimer()和KillTimer()这两个函数的调用者是否正确,另外你可以在退出调用KillTimer()之前让程序等待一段时间再退出,或者在退出之前调用一下你所说的按钮函数。
      

  9.   

    看看你的SetTimer和OnTimer代码如何?
      

  10.   

    哪里都行。OnTimer中的代码有问题吧。
      

  11.   

    KillTimer()后,用Sleep(50)试试。
      

  12.   

    既然用一个按钮来销毁是正常的,
    而在关闭的时候销毁就出错,
    我认为是因为WM_TIMER消息没有处理完成导致的,
    不过,按楼上的Sleep(50)也没有用,
    除非是多线程,一个线程Sleep,别的线程可以继续运行。
      

  13.   

    情况应该是这样的,我在一个函数中打开串口资源,
    然后在 OnTime() 中对串口进行扫描,定时读取数据。实际上,微软的 Overlapped 会开一个线程进行硬件资源的访问。
    现在的问题是可能主线程退出之后,Overlapped 线程没有退出引起的。但是调试版本没有问题,看微软的代码是当 #define DEBUG 的时候,
    多了几行处理的代码。 
      

  14.   

    为什么要用定时器事件去读串口??
    推荐你一个,moxa公司的pcomm.dll
    个人认为很好用,串口编程一直用它。