找回密码
 加入
搜索
查看: 2127|回复: 5

[AU3基础] 无法退出循环结果导致cpu占100%,求助![已解决]

  [复制链接]
发表于 2011-2-25 23:27:41 | 显示全部楼层 |阅读模式
本帖最后由 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%,
发表于 2011-2-25 23:31:28 | 显示全部楼层
Wend前面加个sleep
 楼主| 发表于 2011-2-25 23:37:03 | 显示全部楼层
不能直接退出吗?新手,嘿嘿,很菜
发表于 2011-2-26 00:19:41 | 显示全部楼层
回复 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
发表于 2011-2-26 01:48:50 | 显示全部楼层
本帖最后由 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写,在论坛贴的时候用[code]标签把代码括起来过来,这样子方便查找.
 楼主| 发表于 2011-2-26 23:26:58 | 显示全部楼层
谢谢大家的指点
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-2 14:34 , Processed in 0.078587 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表