| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1093 人关注过本帖
标题:超时代码应该怎么写
只看楼主 加入收藏
woa
Rank: 1
等 级:新手上路
帖 子:159
专家分:0
注 册:2008-12-4
结帖率:85.37%
收藏
已结贴  问题点数:16 回复次数:8 
超时代码应该怎么写

XmlHttp.Send
stime = Now
While XmlHttp.ReadyState <>2
DoEvents
ntime = Now
If DateDiff("s", stime, ntime) > 1 Then GetHtml = "响应超时": Exit Function
Wend

这样有个致命的BUG,占用CPU太高了。。
2011-05-19 13:03
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:8 
我也遇过嫌CPU负载太高的客户~但是相对的处理速度会变慢~所以Sleep()时间要自己Try~

程序代码:
XmlHttp.Send
stime = Now 
While XmlHttp.ReadyState <>2
    MyDoEvents 50    '数字自己调整~
    ntime = Now
    If DateDiff("s", stime, ntime) > 1 Then GetHtml = "响应超时": Exit Function 
Wend

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Function MyDoEvents(Optional ByVal dwMilliseconds As Long = 1)

   MyDoEvents = DoEvents()
   Sleep dwMilliseconds
   
End Function

不要選我當版主
2011-05-19 15:57
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:8 
你可以单独开一个 定时器 控件来负责这个事。

当发出 数据后,立即 开启定时器。

定时器,就负责读这个数据,如果多少次定时器还没读到数据, 那么就提示 超时 ,并且关闭连接。
如果读到了数据,把读到的数据,传给处理函数。

授人于鱼,不如授人于渔
早已停用QQ了
2011-05-19 20:09
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
定时器 控件有一个缺陷~开了就关不掉~就算属性设False~控件一样停不了会一直运行~只能另外设一个布林变量~来决定跑不跑里面的程序~

不要選我當版主
2011-05-19 22:36
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
以下是引用wube在2011-5-19 22:36:15的发言:

定时器 控件有一个缺陷~开了就关不掉~就算属性设False~控件一样停不了会一直运行~只能另外设一个布林变量~来决定跑不跑里面的程序~



那比使用 死循环来等待时间的办法,用户就感觉好多了。
如果使用 API 来暂停程序的执行,会导致暂停期间,程序没有任何响应,界面有可能变成一片白。

具有同样超时,并且同时只有一个会执行的控件,可以共用一个定时器,内部用变量标记当前状态就是了。
定时器,可以使用 1 秒执行一次,每个执行周期里的代码尽可能的短,尽量不要出现 大的循环,避免重复使用 控件 的某个属性,可以保存在变量中。

[ 本帖最后由 风吹过b 于 2011-5-19 22:41 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2011-05-19 22:38
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
首先我不清楚他的程序要做什么~只针对"占用CPU太高了。。"这句话回应~

MyDoevents = Doevents + Sleep(?)'?=>通常我都设10 =(10/1000)秒(当然数字越高CPU负载越低)
所以有Doevents画面不会一片白~没有Doevents画面才会一片白~
之后又加了Sleep()~可让CPU的短暂休息1 / 100秒~人是不会感觉的出来的~

等于一次写二种功能~
只是1/100秒是累計的~他While要跑1百萬次的話~就等於1百萬/100=會慢將近3小時~
所以我才会说数字自己要去Try~
依照我的经验(我用过)~整只程序的Sleep时间总量低于50~几乎会没啥感觉~

而且我也没说用定时器不好~只是我用过这控件确实有这缺陷~只是提出来讨论而已~

[ 本帖最后由 wube 于 2011-5-19 23:07 编辑 ]

不要選我當版主
2011-05-19 23:03
woa
Rank: 1
等 级:新手上路
帖 子:159
专家分:0
注 册:2008-12-4
收藏
得分:0 
sleep有个BUG,就是程序没跑完,就跑下一次的过程了。。
2011-05-20 01:32
woa
Rank: 1
等 级:新手上路
帖 子:159
专家分:0
注 册:2008-12-4
收藏
得分:0 
我记得vb的精度是55,设置55以内都是55
2011-05-20 01:33
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
回复 8楼 woa
你说的错误我有遇过~但是我遇到的是程序还没跑完~又开另一个Form后马上再把它关掉~会导致原程序循环重运行~Sleep()的BUG我倒是没注意~

Sleep有最低限制我知道~不过我是分段作的~我的工程里有很多程序~大程序包小程序~大循环包小循环~我就Sleep各别放在实测过后CPU负荷较重的位置~总共延迟时间加起来约100ms~
P.S 我是做2支程序~延迟300毫秒的版本~和延迟100毫秒的版本让他们自行选择~最后他们选择延迟100毫秒的版本~

所以处理时间拉长约2倍~但是CPU的负荷降了3分之二~约只剩25%左右~因为客户要一次同时连开5支程序~5台机器同时连线到一台负责转档的服务器做转档动作~
所以一次花约150秒能转5个档案(每个档案都到300MB起跳的大小)~让CPU负荷维持在100趴左右~

这是因为我这个客户的案例是这种需求~别的案例有别的需求~那就要看设计者怎决定了~
其实客户给我的限制是最慢再12分内要转完一个档案~但后来经过讨论~约150秒就能转完~CPU的负载又在能接受的范围内就OK了~

[ 本帖最后由 wube 于 2011-5-20 02:18 编辑 ]

不要選我當版主
2011-05-20 02:14
快速回复:超时代码应该怎么写
数据加载中...
 
   



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

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