xyhqqaa 发表于 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();这个是发送邮件的

请问下这样的判断有错吗。。。为啥会提前发。。而且进程还在的时候就发送了。。。何解。还需要加什么判断比较准确呢。。囧{:1_506:}

user3000 发表于 2012-7-17 15:43:13

以前用过 ProcessWaitClose , 似乎也发现了类似问题.
后来就一直用下面代码替代了:While ProcessExists('explorer.exe')
        Sleep(50)
WEnd

xiaowo 发表于 2012-7-17 15:45:43

遇到过类似的问题,用Runwait或ShellExecuteWait,但Runwait或ShellExecuteWait的内容还没执行完,代码就继续往下执行了

zldfsz 发表于 2012-7-17 15:55:22

理论上是没问题的,如果出这个问题就换另一种方法吧,如2楼的方法。
BTW:Sleep(50000)是暂停50秒,sleep是以毫秒为单位计算的,所以暂停5分钟应该是Sleep(5*60*1000)

xiaowo 发表于 2012-7-17 23:13:38

2楼的方法好呀,我怎么就没想到呢~

xyhqqaa 发表于 2012-7-19 09:23:01

回复 2# user3000


    囧。。user3000 哥。。。俺试了下,发现我的电脑还是无法判别。。进程还是存在的时候,已经提前发送邮件的步骤了,是我理解您的意思有误吗还是- -
While Not ProcessExists("robocopy.exe")
      Sleep(5000)
_sendmail()
WEnd我这边是哪错了。。。求指教。。。。{:1_250:}

user3000 发表于 2012-7-19 09:35:48

回复 6# xyhqqaa

我有点头晕...真是哭笑不得.
应该是这样的吧?While ProcessExists("robocopy.exe")
      Sleep(5000); 当此进程存在的时候, 就循环:反复 Sleep 5 秒
WEnd
; 没有此进程后, 循环已结束, 发送邮件
_sendmail() 是很囧 , 你要好好补习一下基本的语法了

xyhqqaa 发表于 2012-7-19 10:03:50

本帖最后由 xyhqqaa 于 2012-7-19 10:04 编辑

回复 7# user3000


    这个我之前早试过了。。还是存在问题= =,所以我才以为是我的错了还是啥的。。还换了下面那种!囧、。我再重新测试下。。。谢谢!

user3000 发表于 2012-7-19 10:51:22

回复 8# xyhqqaa
没用过robocopy , 刚才下了一个, 测试很正常啊.

xyhqqaa 发表于 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()

user3000 发表于 2012-7-19 14:03:54

回复 10# xyhqqaa

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

lanfengc 发表于 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

li123168 发表于 2012-7-23 23:30:50

回复xyhqqaa

明白了, 1楼的代码加一句 Sleep , 应该也没问题了.
user3000 发表于 2012-7-19 14:03 http://www.autoitx.com/images/common/back.gif

用ProcessWait可能更可靠吧!!
_rocopy();这个是运行备份调用的
ProcessWait("robocopy.exe") ;等待此进程建立完成!
ProcessWaitClose("robocopy.exe")
Sleep(50000)
_sendmail();这个是发送邮件的

夜猫猫 发表于 2012-7-24 00:18:05

反复检测.休眠时间短点....

酷儿 发表于 2012-7-25 16:52:27

我看爱是不错都 谢谢了
页: [1]
查看完整版本: 求助下。关于进程存在判断(已解决)