我用 SetTimer() 设定了一个定时器,
在 Debug 版本中没有问题。但是在 Release 版本中,无论我是在视图类的释构函数中调用
KillTimer(), 还是在 OnDestroy() 函数中 KillTimer(),
都有异常!!
在 Debug 版本中没有问题。但是在 Release 版本中,无论我是在视图类的释构函数中调用
KillTimer(), 还是在 OnDestroy() 函数中 KillTimer(),
都有异常!!
而且是微软自己的 wincore.cpp 文件产生的。
如果在一个按钮函数中先 KillTimer(), 再退出窗口,程序就正常了。奇诡是debug版本无论是销毁不销毁定时器退出,都没问题!!!
问题是的,如果我只在OnTimer()中做简单的事情就没问题。
如果向窗口输出一个字符串。但是我的程序是向串口读取信息,
都到东西后再用 PostMessage() 向主窗口发送一个消息来处理硬件接收到的信息。
但是已经发送了的WM_TIMER消息是不会自动从消息队列里清除掉的"
>>>>>>>>>>>
具体应该怎么处理呢?微软的例子也是只是在 OnDestroy 中调用:
KillTimer()
即使是我的另外一个模块--负责通讯的,
完全不发送消息,情况也完全一样。目前,唯一安全退出的途径是用一个按钮将Timer销毁,
再关主窗口,这样就不会有任何异常。
但是,如果不用 KillTimer() 的话在发行版中就有异常,
而且是微软自己的 wincore.cpp 文件产生的。
如果在一个按钮函数中先 KillTimer(), 再退出窗口,程序就正常了。
奇诡是debug版本无论是销毁不销毁定时器退出,都没问题!!!
——————————————————————————————————————————我个人认为计时器是一个系统资源,在一个程序中若不用时应该用KillTimer()删除,但在程序退出时,MFC的程序应能自动清除;按你的描述请仔细核对SetTimer()和KillTimer()这两个函数的调用者是否正确,另外你可以在退出调用KillTimer()之前让程序等待一段时间再退出,或者在退出之前调用一下你所说的按钮函数。
而在关闭的时候销毁就出错,
我认为是因为WM_TIMER消息没有处理完成导致的,
不过,按楼上的Sleep(50)也没有用,
除非是多线程,一个线程Sleep,别的线程可以继续运行。
然后在 OnTime() 中对串口进行扫描,定时读取数据。实际上,微软的 Overlapped 会开一个线程进行硬件资源的访问。
现在的问题是可能主线程退出之后,Overlapped 线程没有退出引起的。但是调试版本没有问题,看微软的代码是当 #define DEBUG 的时候,
多了几行处理的代码。
推荐你一个,moxa公司的pcomm.dll
个人认为很好用,串口编程一直用它。