找回密码
 加入
搜索
查看: 6035|回复: 14

[AU3基础] 求助下。关于进程存在判断(已解决)

 火.. [复制链接]
发表于 2012-7-17 15:06:07 | 显示全部楼层 |阅读模式
本帖最后由 xyhqqaa 于 2012-7-24 14:53 编辑

之前测试备份。需要调用robocopy,多次测试发现很多问题。。。现在到最后的时候,关于日志的备份有点困惑。言归正题,我调用robocopy进行备份的时候,在进程内有robocopy这个进程,同时,它也会生成备份日志,也就是说当robocopy这个进程自动关闭的时候,就是日志生成完毕的时候,我的想法是判断robocopy.exe进程是否关闭,如果关闭了,先暂停5分钟,在吧生成的日志发送到邮箱里面去。可是,事与愿违,现在的问题,进程还存在,日志还在生成,但还没结束,但是我日志已经提前发送到邮箱了。。导致接收的日志不完整。
_rocopy();这个是运行备份调用的
ProcessWaitClose("robocopy.exe")
Sleep(50000)
_sendmail();这个是发送邮件的

请问下这样的判断有错吗。。。为啥会提前发。。而且进程还在的时候就发送了。。。何解。还需要加什么判断比较准确呢。。囧
发表于 2012-7-17 15:43:13 | 显示全部楼层
以前用过 ProcessWaitClose , 似乎也发现了类似问题.
后来就一直用下面代码替代了:
While ProcessExists('explorer.exe')
        Sleep(50)
WEnd

评分

参与人数 2金钱 +30 收起 理由
xiaowo + 20 好方法,可以暂停主函数
xyhqqaa + 10 嘻嘻。。。谢谢。。我试试、。、

查看全部评分

发表于 2012-7-17 15:45:43 | 显示全部楼层
遇到过类似的问题,用Runwait或ShellExecuteWait,但Runwait或ShellExecuteWait的内容还没执行完,代码就继续往下执行了
发表于 2012-7-17 15:55:22 | 显示全部楼层
理论上是没问题的,如果出这个问题就换另一种方法吧,如2楼的方法。
BTW:Sleep(50000)是暂停50秒,sleep是以毫秒为单位计算的,所以暂停5分钟应该是Sleep(5*60*1000)

评分

参与人数 1金钱 +10 收起 理由
xyhqqaa + 10 嘻嘻。。。。我错了

查看全部评分

发表于 2012-7-17 23:13:38 | 显示全部楼层
2楼的方法好呀,我怎么就没想到呢~
 楼主| 发表于 2012-7-19 09:23:01 | 显示全部楼层
回复 2# user3000


    囧。。user3000 哥。。。俺试了下,发现我的电脑还是无法判别。。进程还是存在的时候,已经提前发送邮件的步骤了,是我理解您的意思有误吗还是- -
While Not ProcessExists("robocopy.exe")
        Sleep(5000)
_sendmail()
WEnd
我这边是哪错了。。。求指教。。。。
发表于 2012-7-19 09:35:48 | 显示全部楼层
回复 6# xyhqqaa

我有点头晕...真是哭笑不得.
应该是这样的吧?
While ProcessExists("robocopy.exe") 
        Sleep(5000); 当此进程存在的时候, 就循环:反复 Sleep 5 秒
WEnd
; 没有此进程后, 循环已结束, 发送邮件
_sendmail() 
是很  囧 , 你要好好补习一下基本的语法了
 楼主| 发表于 2012-7-19 10:03:50 | 显示全部楼层
本帖最后由 xyhqqaa 于 2012-7-19 10:04 编辑

回复 7# user3000


    这个我之前早试过了。。还是存在问题= =,所以我才以为是我的错了还是啥的。。还换了下面那种!囧、。我再重新测试下。。。谢谢!
发表于 2012-7-19 10:51:22 | 显示全部楼层
回复 8# xyhqqaa
没用过robocopy , 刚才下了一个, 测试很正常啊.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +20 贡献 +3 收起 理由
xyhqqaa + 20 + 3 user3000 辛苦了。。我多多补充下基本功- -

查看全部评分

 楼主| 发表于 2012-7-19 11:08:34 | 显示全部楼层
回复 9# user3000

囧、。、、、现在看了您的代码。。发现要双重循环判断竟然就可以了、、之前单个反而不行。不过问题估计可以解决了。。。谢谢。。我再多多测试。。。!!
While Not ProcessExists("robocopy.exe")
        Sleep(50)
WEnd
While ProcessExists("robocopy.exe")
        Sleep(50)
WEnd
MsgBox("","","开始邮件")
_sendmail()
发表于 2012-7-19 14:03:54 | 显示全部楼层
回复 10# xyhqqaa

明白了, 1楼的代码加一句 Sleep , 应该也没问题了.
_rocopy();这个是运行备份调用的
Sleep(2000) ; 延迟一下, 确定此进程已经建立!
ProcessWaitClose("robocopy.exe")
Sleep(50000)
_sendmail();这个是发送邮件的

评分

参与人数 2威望 +5 金钱 +10 贡献 +6 收起 理由
xyhqqaa + 1 弱弱的说下,这方法不行。。。最早便是这样 ...
pusofalse + 5 + 10 + 5 乐于助人。

查看全部评分

发表于 2012-7-20 13:17:11 | 显示全部楼层
可以采用另开监视线程的方式来做,既不会影响整体的运行流程,还能及时的监测到。

_rocopy();这个是运行备份调用的
ConsoleWrite(@CRLF&@TAB&"我正在等待进程robocopy.exe出现……")                ;输出调试信息,便于查看
Do                ;等待进程创建成功
        Sleep(100)
Until ProcessExists("robocopy.exe")

ConsoleWrite(@CRLF&@TAB&"好了,进程robocopy.exe出现了,接下来,我将启动一个线程监测进程。当进程关闭后,我发送邮件。")  ;输出调试信息
AdlibRegister("MyMoniteFunc",2000)                ;启动一个定时器线程

While 1
        
        Sleep(100)
        
WEnd

Func MyMoniteFunc()        ;定时器要执行的操作函数
        If Not ProcessExists("robocopy.exe") Then        ;如果不存在这个进程了,则认为是进程退出了,执行发送邮件操作
                ConsoleWrite(@CRLF&@TAB&"监测中-进程关闭了,我要发送邮件了!")
                _sendmail();这个是发送邮件操作函数
                AdlibUnRegister("MyMoniteFunc")        ;发送完了之后终止定时器
                MsgBox(64,"提示","右键已经发送完毕了,我退出了哦~")
        Else
                ConsoleWrite(@CRLF&@TAB&"监测中-进程robocopy.exe还没有关闭呢")        ;如果进程还在,则输出调试信息
        EndIf
EndFunc

评分

参与人数 2金钱 +40 收起 理由
xyhqqaa + 10
haijie1223 + 30 ---

查看全部评分

发表于 2012-7-23 23:30:50 | 显示全部楼层
回复  xyhqqaa

明白了, 1楼的代码加一句 Sleep , 应该也没问题了.
user3000 发表于 2012-7-19 14:03


用ProcessWait可能更可靠吧!!
_rocopy();这个是运行备份调用的
ProcessWait("robocopy.exe") ;  等待此进程建立完成!
ProcessWaitClose("robocopy.exe")
Sleep(50000)
_sendmail();这个是发送邮件的
发表于 2012-7-24 00:18:05 | 显示全部楼层
反复检测.休眠时间短点....
发表于 2012-7-25 16:52:27 | 显示全部楼层
我看爱是不错都 谢谢了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-18 22:48 , Processed in 0.091671 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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