Ttimer的问题,为什么一个带TTimer的程序连续运行几天后就停了?100分!(100分)

  • 主题发起人 主题发起人 草央包包
  • 开始时间 开始时间

草央包包

Unregistered / Unconfirmed
GUEST, unregistred user!
timer为动态生成,ontimer事件中对数据库表有打开、扫描、关闭的操作。
程序运行一两天后就停住不动,但并未死机,因为其它程序均运行正常,
本程序也可打开MENU,打开对话窗等等,也可正常退出,再进入也正常,
但还是一两天后出问题。
故障现象就象TIMER事件不再触发,
决没在程序中关闭或FREE过TIMER。
 
我想根源不在timer,你可以在OnTimer事件里只写一段最简单的程序来验证。因为我做的一个程序里用了多线程,
也是运行一会就停住了(当这个程序只有简单的几十行代码的时候没有问题)。
解决的关键要知道在处理多线程时有哪些是必须注意的---这个我目前也不知道:)
 
同意楼上的说法,你的OnTimer事件里有多个线程吧?改成单线程的应该就可以了。
 
用多线程来处理比较好,
 
同意楼上的说法,
 
》》用多线程来处理比较好,
timer本身就是一个多线程的。
 
你的Interval设为多大,太小的话就可能有问题,我设为20分钟除触发一次,运行了几
个月的没有问题,我也是做数据库用的。
 
to savenight:
Ttimer本身不是多线程的,它是基于消息的。它只是每隔Interval时间就发送一
个WM_TIMER消息。如果此刻你的线程正在运算,这个消息将被阻塞而不会马上触发
ontimer事件处理过程。
 
没有用多线程,interval为250,因为有一些操作是250ms一次,
操作数据库是5秒一次(在ontimer里加了计数,20次事件扫一遍库表)。
 
是不是因为时间延迟的原因?
你干脆监测一下时间,每隔多少个小时就把timer重新启动一次。
 
最后单独用一个线程,字样比较保险,不容易受干扰,
 
这个问题
曾经让我在半夜惊醒!
曾经让我陷入沉思,
我明天的工作在哪里?
它现身江湖了。
听课!
 
你确信你在 ontimer 事件处理中的代码能在 0.25秒中完成执行吗?如果完不成,就会
阻塞下一次 ontimer 事件处理过程。我想比较好的办法是新开一线程去执行 ontimer
事件中的数据库操作,完成后自动释放该线程。而只在主线程中接收 WM_TIMER 消息。
 
Xeen:
再请教一下,如果我的ontimer事件执行超过0.25秒,阻塞了下一次事件,
会引起什么问题?仅仅是少执行一次ontimer事件,还是会影响到之后所
有的事件触发?
 
谢谢xeen:),是我理解错了,以前一直听别人说ttimer就是自己开了一个线程,我也就人云亦云了。

由于ttimer的resolution 只有55ms,这样的话如果在短时间内遇到windows系统阻塞的话,那么消息就很容易丢失了。
 
影响不了的, 只不过下一次连续运行两次OnTimer而已, 不过可以想象, 这么运行一段时间后消息队列就被WM_TIMER塞满了。
建议用线程实现OnTimer部分。 TTimer只作调度。 不过这样代码复杂了点, 特别是原来OnTimer代码中需要同步某些操作时。
如果想简单那么就把定时部分(定时可以用线程代码中WaitSingleObject等待来代替)和操作部分用用一个线程来实现。 可以扔掉TTimer了。
 
我也遇到过类似问题,我设置interval为15分钟,正常运行2天之后就不灵了,
但是程序看上去一切正常,就是timer不灵了,而且我也没有使用多线程,而且
timer里面执行的代码绝对可以在15分钟之内完成。

这个问题困惑了我很久,被经理骂了好几次,可是至今找不到原因!

如果还有更多的人遇到过类似问题,我不得不怀疑是delphi的bug
 
to 一个过客, 你应当怀疑是windows的bug[:)]
delphi中timer处理非常简单。 OnTimer是由WM_TIMER触发的。 所以不能触发的话只能说明windows不再给程序发送WM_TIMER了。
这个好像不能归罪于delphi吧?
 
我认为很多时候wm_timer消息很容易丢失,你丢失了部分wm_timer导致一些资源或者同步没有
作好,所以最后导致程序停止,其实系统还有很多其他函数可以达到ttimer的功能
而且更精确,你可以用他们来做,
 
如果ontimer事件没有在 interval 时间中完成执行,意味着未被处理的WM_TIMER消息会
越来越多。可以预见在足够长的时间后线程消息队列将被占满了.
 
后退
顶部