| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2306 人关注过本帖
标题:这段程序运行中经常造成系统无响应,大侠们看看,问题出在哪里啊
只看楼主 加入收藏
Pgwyg
Rank: 2
等 级:论坛游民
帖 子:28
专家分:20
注 册:2022-6-10
收藏
得分:0 
手机版不能截屏
2022-06-12 12:18
Pgwyg
Rank: 2
等 级:论坛游民
帖 子:28
专家分:20
注 册:2022-6-10
收藏
得分:0 
timer控件初始化在表单INIT事件中,代码如下:
Do while .t.
If sec(datetime())=int(sec(datetime()))
Thisform.timer1.interval=1000
Thisform.timer1.reset
Thisform.timer1.enabled=.t.
Exit
Endif
Enddo
延时程序是这样的:
Function wait_time
Lparameter  x_time
Do while second()>x_time
Enddo
Return .t.
Endfnc

使用inkey()或wait光标随意乱闪,看着不舒服
2022-06-12 15:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用Pgwyg在2022-6-12 12:12:48的发言:

关键是两个时间点让人费解

暂不要处理数据,先排除“挂死”的问题,要花点时间测试。
如果一定要用timer,也可以试试异步消息来处理。因timer消息优先级很低,且timer事件过程也有时限,timer事件过程执行并不是那么稳定。
异步消息处理过程:自定义一个窗口消息事件过程,timer事件触发时暂停timer事件并PostMessage自定义窗口消息,在自定义窗口消息事件过程执行数据处理,数据处理完毕继续启动timer事件。
“挂死”的问题解决了就好办,其他问题就是时间控件问题。
最好不要用timer来做实时监控,不太精准稳定可靠。
可以考虑用多进程来处理
2022-06-12 17:37
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1089
专家分:2682
注 册:2015-12-30
收藏
得分:0 
If sec(datetime())=int(sec(datetime()))
这个条件好像肯定是.T.吧?

另外,正如吹版所言,由于种种原因,timer中的执行过程所需时间并不确定,执行所需时间超过间隔时间的时候会造成timer过程未完成,下一次timer又触发了
我习惯的做法:timer过程中,首先this.enable=.F.,然后执行程序,执行完毕后this.enable=.T.。或者再加一句this.reset(注意程序中如果有条件退出或中断时,别忘了this.enable=.T.)
2022-06-12 18:07
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
方法不是很好,你的方法理论上可以,但由于定时器问题导致。
解决方法,用变量,判断,时间相减,应该可以
用1个全程变量,t更新时间,

public t更新时间
t更新时间 = datetime()

** Timer 事件
if datetime()-t更新时间 >=3600 && 3600秒,1小时
   t更新时间 = datetime() && 重新保存时间
   * 做你更新的程序
endif
2022-06-13 08:47
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
这样做,利用时间差,判断上次更新时间与当前时间,只要超过1小时,就更新,同时保存上次更新时间,要先保存更新时间,就算定时器,怎么不灵活,也会 0.1秒触发1次。
当然,加上开关,可能会比较好


public t更新时间
t更新时间 = datetime()

** Timer 事件
if datetime()-t更新时间 >=3600 && 3600秒,1小时
   t更新时间 = datetime() && 重新保存时间
   this.Enabled = .F.
   * 做你更新的程序
   this.Enabled = .T.
endif
2022-06-13 08:56
Pgwyg
Rank: 2
等 级:论坛游民
帖 子:28
专家分:20
注 册:2022-6-10
收藏
得分:0 
回复 16楼 mywisdom88
谢谢您,我需要整点保存数据,而且要有时间显示,原来使用一个timer实现时间同步显示、实时数据采集、和数据保存,出现问题后又添加了一个专门负责数据采集,还是出现程序无响应的问题,即使停止数据采集工作,也是这样,现在又加了一个计时器,专门负责时间显示,看看能否成功。百思不得其解的是有时工作几天没问题,一旦出现问题,就是停在19:59:59和23:59:59,如果随机还好理解。TYR也未能捕捉到错误。
TRY
DO FORM YCCB2
READ EVENTS        
CATCH TO ex
        ex_info= "错误编号: "+ALLTRIM(STR(ex.ErrorNo))+CHR(10)+CHR(13)+;
        "    错误行号: "+ALLTRIM(STR(ex.LineNo))+CHR(10)+CHR(13)+;
        "    错误信息: "+ALLTRIM(ex.Message)+CHR(10)+CHR(13)+;
        "    错误函数: "+ALLTRIM(ex.Procedure)+CHR(10)+CHR(13)+;
        "    错误细节: "+ALLTRIM(ex.Details)+CHR(10)+CHR(13)+;
        "调用堆栈级别: "+ALLTRIM(STR(ex.StackLevel))+CHR(10)+CHR(13)+;
        "  代码行内容: "+ALLTRIM(ex.LineContents)
        StrToFile(ex_info, "d:\error_info.txt")
ENDTRY
2022-06-13 09:39
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4966
注 册:2013-2-16
收藏
得分:0 
类似问题我以前遇到过,当时在vfp平台上,也没有很好地解决,后来采用变通的方式解决的 .
我的解决方式为:
利用SqlServer服务器上的定时任务,运行事先写好存储过程解决的.
也就是说,不是在vfp平台上解决的.
2022-06-13 10:07
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用Pgwyg在2022-6-13 09:39:44的发言:

谢谢您,我需要整点保存数据,而且要有时间显示,原来使用一个timer实现时间同步显示、实时数据采集、和数据保存,出现问题后又添加了一个专门负责数据采集,还是出现程序无响应的问题,即使停止数据采集工作,也是这样,现在又加了一个计时器,专门负责时间显示,看看能否成功。百思不得其解的是有时工作几天没问题,一旦出现问题,就是停在19:59:59和23:59:59,如果随机还好理解。TYR也未能捕捉到错误。
TRY
DO FORM YCCB2
READ EVENTS        
CATCH TO ex
        ex_info= "错误编号: "+ALLTRIM(STR(ex.ErrorNo))+CHR(10)+CHR(13)+;
        "    错误行号: "+ALLTRIM(STR(ex.LineNo))+CHR(10)+CHR(13)+;
        "    错误信息: "+ALLTRIM(ex.Message)+CHR(10)+CHR(13)+;
        "    错误函数: "+ALLTRIM(ex.Procedure)+CHR(10)+CHR(13)+;
        "    错误细节: "+ALLTRIM(ex.Details)+CHR(10)+CHR(13)+;
        "调用堆栈级别: "+ALLTRIM(STR(ex.StackLevel))+CHR(10)+CHR(13)+;
        "  代码行内容: "+ALLTRIM(ex.LineContents)
        StrToFile(ex_info, "d:\error_info.txt")
ENDTRY

整点,和差几秒,有区别吗,我说的时间差,是可以做到相差几秒处理的。
19:59:59,就是20点,那你在20:00:01~20:00:05秒处理,应该可以吧
2022-06-13 11:16
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
你处理时间,相差1秒,都不可以的话,在VFP中的定时器处理,有点难,你用18楼的方法看看,就算是18楼的方法,你电脑时间也会出现几秒的时间差
2022-06-13 11:19
快速回复:这段程序运行中经常造成系统无响应,大侠们看看,问题出在哪里啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064905 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved