注册 登录
编程论坛 VFP论坛

为什么timer长时间后会停止工作?

琅拿度 发布于 2023-07-15 10:59, 1217 次点击
我这个是用设计快捷键控制foobar音乐播放器的

但是时间一长(比如说半天、一天或两天后,这个时间不确定)timer就不工作了

我是用timer来监控有没有按下快捷键的,如果timer不工作就不知道使用者有没有按快捷键了


之所以能确定是timer导致,是因为我在右下角了一个按键加了一段开启timer的代码,每次我发现快捷键不起左右后,按这个键就能用了,所以就证明了是timer不工作了




只有本站会员才能查看附件,请 登录
21 回复
#2
kangss2023-07-15 17:28
VFP的timer没见谁反应有BUG

“Thisform.timer_key.Interval=30”在表单初始化时执行一次就行了,无需反复执行;

“Thisform.timer_key.Interval=0”相当于“Thisform.timer_key.Enabled=.F.”。执行 timer 事件过程开始执行“Enabled=.F.”末尾执行“Enabled=.T.”即可;

“Thisform.f_nextlist”个人感觉自定义方法这样用更好“Thisform.f_nextlist()”:可以区分是表单的自定义变量还是自定义方法,还可以传入参数;

timer_key 的事件中执行了 5 个自定义方法,这 5 个里面都有“Do While Enddo”,怀疑里面的代码导致某个 do 死循环,导致 timer_key 就没法执行最后的“Enabled=.T.”,导致你看到的 timer_key 像是“停止”了

[此贴子已经被作者于2023-7-15 17:29编辑过]

#3
琅拿度2023-07-16 00:27
以下是引用kangss在2023-7-15 17:28:38的发言:

VFP的timer没见谁反应有BUG

“Thisform.timer_key.Interval=30”在表单初始化时执行一次就行了,无需反复执行;

“Thisform.timer_key.Interval=0”相当于“Thisform.timer_key.Enabled=.F.”。执行 timer 事件过程开始执行“Enabled=.F.”末尾执行“Enabled=.T.”即可;

“Thisform.f_nextlist”个人感觉自定义方法这样用更好“Thisform.f_nextlist()”:可以区分是表单的自定义变量还是自定义方法,还可以传入参数;

timer_key 的事件中执行了 5 个自定义方法,这 5 个里面都有“Do While Enddo”,怀疑里面的代码导致某个 do 死循环,导致 timer_key 就没法执行最后的“Enabled=.T.”,导致你看到的 timer_key 像是“停止”了


只有本站会员才能查看附件,请 登录



感谢你的意见:
VFP我已经感受过很多次bug,不可理喻的bug
如:
https://bbs.bccn.net/thread-510561-1-1.html
https://bbs.bccn.net/thread-506195-1-1.html



1、我其它的软件也很多使用timer,唯独这个软件会出现timer莫名停止的问题。(我高度怀疑与托盘图标有关系,已经换过自带的控件,也换过myfll控件依然存在这个问题)

2、“timer 事件过程开始执行“Enabled=.F.”末尾执行“Enabled=.T.”即可”   
    这个我基本都是这么做了
3、“Thisform.f_nextlist”
    这个应该没有影响timer的可能性,赞不讨论

4、timer_key 下的5个“Do While Enddo”
   里面的5个循环都是
current_time=Seconds()
Do While Abs(Seconds()-current_time)<0.3
    拖延时间=1
Enddo
这个循环应该不存在死循环的可能;这是其一;其二:假设进入了死循环,我是没办法点击右下角的按钮的,我右下角的按钮加了timer的“Enabled=.T.”,这个是我怀疑timer停止运行了所以加的验证语句,果然在快捷键失效的情况下,只要我一按这个按钮,快捷键就马上正常使用了,充分证明了timer是停止的,如果是有死循环正在执行的话我是没有办法点击这个按钮的。

5、我设计了两个timer的,其实正常情况下一个timer_key是够用的了,之所以加一个timer_activate,是想两个timer轮流激活对方不让彼此停止,事实效果好像是只是延长了timer工作的时长,就是说本来用一个timer本来几个小时就停止了,用两个好像有时能达到一两天。(好像是比较业余的实验)

综合:我现在高度怀疑是因为第一点的问题,就是托盘,就是放托盘就会这样

[此贴子已经被作者于2023-7-16 00:32编辑过]

#4
吹水佬2023-07-16 08:10
试试在timer开头第一句为:
inkey(0.001)
#5
sych2023-07-16 21:25
你可以在timer代码中加入这已句thisform.caption=tran(seco()),观察是否是timer停止工作了
#6
琅拿度2023-07-16 22:58
以下是引用sych在2023-7-16 21:25:31的发言:

你可以在timer代码中加入这已句thisform.caption=tran(seco()),观察是否是timer停止工作了


确认是停了的
#7
琅拿度2023-07-16 22:58
以下是引用吹水佬在2023-7-16 08:10:10的发言:

试试在timer开头第一句为:
inkey(0.001)


能说说是什么思路吗?
#8
吹水佬2023-07-16 23:48
以下是引用琅拿度在2023-7-16 22:58:50的发言:

能说说是什么思路吗?

有定时器不定时的说法,精度、优先级、可靠稳定性都低,繁忙时甚至会被丢弃。
inkey()会产生一个中断,给定时器喘口气定定神。
#9
sych2023-07-17 15:20
回复 6楼 琅拿度
看你的发帖时间,你应该没有测试
#10
琅拿度2023-07-17 19:22
以下是引用sych在2023-7-17 15:20:28的发言:

看你的发帖时间,你应该没有测试


我3楼里的描述,已经可以证实timer是停止了的,因为我用一个按钮开启timer后,一切就正常了

#11
琅拿度2023-07-17 19:27
以下是引用吹水佬在2023-7-16 23:48:35的发言:


有定时器不定时的说法,精度、优先级、可靠稳定性都低,繁忙时甚至会被丢弃。
inkey()会产生一个中断,给定时器喘口气定定神。


反正我是觉得可能和托盘有很大关系的,因为我有其它软件也采用timer,好多年了,一开机就几个月的运行的,里面的timer从来不会停止

我试试你说的方法吧,附件里的代码也很少的,帮忙看看有没有其它的原因导致?
#12
吹水佬2023-07-19 05:36
回复 11楼 琅拿度
提供的代码不一定能正常运行起来,尤其是与注册表相关部份。
只测试timer可精简代码,去掉无相关的代码,这样测试问题更清晰一些。
#13
琅拿度2023-07-21 14:39
回复 12楼 吹水佬

本身这个东西就没有几个代码,timer里加了inkey(0.007), 依然出现问题,测试步骤描述:

1,一开始快捷键(也就是控制音乐播放)正常工作
2,24小时后快捷键正常工作
3,约30多个小时后,快捷键不能正常工作(就是不能控制音乐播放)
4,按右下角按钮(就是timer.enabled=.t.)后,快捷键即可正常工作即证明timer停止了


更新后的源码:
只有本站会员才能查看附件,请 登录
#14
琅拿度2023-07-23 14:08
又试了两天,都是超过24小时,不到48小时失效, 不懂问题到底出在什么地方
#15
Pgwyg2023-08-19 10:46
我因为TIMER控件停止烦恼过,到现在仍未解决,只能使用两个控件,每12个小时轮换一下,xu算是解决问题了
#16
金戈铁马22023-08-19 11:55
学习
#17
iswith2023-08-19 12:32
%99.99999都是自己设计代码问题跟timer本身没有关系。。。。。。。。。。。。。
#18
琅拿度2023-10-27 11:34
已解决问题!解决方法:隐藏托盘后,timer失效,使用myFll,用hotkey再激活timer,目前解决了问题。

(但是仅仅解决了本软件的问题,本软件仅使用按键功能控制,如果别的软件timer是其它的功能,那还算解决不了)

[此贴子已经被作者于2023-10-27 11:36编辑过]

#19
琅拿度2023-10-27 11:39
以下是引用iswith在2023-8-19 12:32:38的发言:

%99.99999都是自己设计代码问题跟timer本身没有关系。。。。。。。。。。。。。


要验证这个问题,也很简单,你就写一个timer,不定时地向某个目录写入一个文件,缩到托盘后,你就不定时查看该目录的写入文件时间就行了
(用的是myfll,另外,我的interval值是37有点频繁不知道和这个有没有关系,你可以试)

[此贴子已经被作者于2023-10-27 11:40编辑过]

#20
琅拿度2023-10-27 11:42
以下是引用iswith在2023-8-19 12:32:38的发言:

%99.99999都是自己设计代码问题跟timer本身没有关系。。。。。。。。。。。。。


而且,这个问题,如果是我代码问题的话,源码也很少,也都在上面的附件里了,你可以查一查

再者:什么样的代码可以一两天都工作正常,时间久了就不行呢?
#21
laowan0012023-10-27 13:39
我的后台程序也使用timer,5分钟执行一次,无人值守,没出现过timer无效的情况
最多的情况下一台服务器同时有6个类似的程序在运行
#22
琅拿度2024-05-03 23:14
以下是引用Pgwyg在2023-8-19 10:46:38的发言:

我因为TIMER控件停止烦恼过,到现在仍未解决,只能使用两个控件,每12个小时轮换一下,xu算是解决问题了


总算遇到一样的人了,起码说明不单只我一个人遇到这样的问题

最新消息: 我目前认为引起timer失效的原因是使用了myfll控件(我只使用myfll里的托盘图标功能),只要隐藏到托盘图标基本时间长了之后就会出现timer失效。作这样判断的原因是因为我有三个虚拟机系统也运行有timer的程序,经常一两个月不关机,也没出现过这种问题。所以就怀疑和myfll或托盘有关系。
1