无法退出循环结果导致cpu占100%,求助![已解决]
本帖最后由 p5200151 于 2011-3-10 01:27 编辑While 1
If ProcessExists("PubwinClient.exe") Then
Sleep(6000)
ElseIf ProcessExists("PubwinClient.exe") = 0 Then
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
Else
If ProcessExists("PubwinClient.exe") = 0 Then
ExitLoop
EndIf
EndIf
WEnd
我的意图是1:检测到PubwinClient.exe在运行,暂停6000毫秒
2:没有检测到PubwinClient.exe,则运行C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe
3:C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe无法运行就直接退出
结果没装PubwinClient.exe的机器上运行后导致cpu占100%, Wend前面加个sleep 不能直接退出吗?新手,嘿嘿,很菜 回复 1# p5200151
While 1
If ProcessExists("CCleaner.exe") Then; 如果“CCleaner.exe”存在
Sleep(6000); 暂停6秒
Else; 如果“CCleaner.exe”不存在
$a = Run(@ProgramFilesDir & '\CCleaner\CCleaner.exe'); 运行@ProgramFilesDir & '\CCleaner\CCleaner.exe'
If $a = 0 Then ExitLoop; 如果无法运行@ProgramFilesDir & '\CCleaner\CCleaner.exe' 即退出循环
EndIf
WEnd 本帖最后由 easied 于 2011-2-26 02:13 编辑
先说一下你那代码的问题
1.结构错误.你的if和elseif把ProcessExists的返回值都判断完了.无论任何时候else都无效,所以程序不会退出
2.延迟错误:在while...wend有可能造成死循环的时候,在wend应该在前面一行加个sleep.这可以防止CPU占用率达100%
3.要是PubwinClient.exe不能运行,Run了也会弹出出错提示或者无响应,程序直接将直接跳过.所以在这里不需要while循环
4.个人建议只用if...else...endif,尽量不用elseif.如果有多种条件,则使用select...endselect来代替.这样子会比较直观;更改判断结构
If ProcessExists("PubwinClient.exe") Then
Sleep(6000)
Else
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
While 1
If ProcessExists("PubwinClient.exe") Then ExitLoop
Sleep(1000)
WEnd
Sleep(6000)
EndIf
;使用do...until代替while...wend死循环
If ProcessExists("PubwinClient.exe") Then
Sleep(6000)
Else
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
Do
Sleep(1000)
Until ProcessExists("PubwinClient.exe")
Sleep(6000)
EndIf
;以上两种结构下如果PubwinClient.exe不能启动,会陷入死循环
;要解决这个问题,需要添加一个超时设置
#include <Date.au3>
If ProcessExists("PubwinClient.exe") Then
Sleep(6000)
Else
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
Local $sTimer = _NowCalc()
Do
;30仍未能启动则判断PubwinClient.exe不能运行,跳出死循环
If _DateDiff("s", $sTimer, _NowCalc()) > 30 Then ExitLoop
Sleep(1000)
Until ProcessExists("PubwinClient.exe")
Sleep(6000)
EndIf
;因为能不能运行PubwinClient.exe只和软件安装与否有关,和Run无关.以直接Run一次就可以了,在这里不需要循环结构
If ProcessExists("PubwinClient.exe") Then
Sleep(6000)
Else
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
Sleep(6000)
EndIf
;把Sleep(6000)提取出来
If ProcessExists("PubwinClient.exe") Then
Else
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
EndIf
Sleep(6000)
;再改一下判断结构
If Not ProcessExists("PubwinClient.exe") Then
Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
EndIf
Sleep(6000)
;继续减.最后就变成这样子了
If Not ProcessExists("PubwinClient.exe") Then Run("C:\Program Files\HintSoft\PubwinClient\PubwinClient.exe")
Sleep(6000)
以后代码用SciTe写,在论坛贴的时候用标签把代码括起来过来,这样子方便查找. 谢谢大家的指点
页:
[1]