dearmb 发表于 2011-2-11 09:50:12

多进程模拟多线程,ProcessClose结束进程失败(已解决)

本帖最后由 dearmb 于 2011-2-16 14:33 编辑

多进程模拟多线程,_CloseHandle()这函数失效了,由于主进程的结束不影响子进程,所以想要在$GUI_EVENT_CLOSE后将所有子进程结束,用ProcessClose结束,代码如下:
                Case $GUI_EVENT_CLOSE
                        $a=ProcessClose(子进程1)
                        MsgBox(0,"",$a)
                        $b=ProcessClose(子进程2)
                        MsgBox(0,"",$b)
                        $c=ProcessClose(子进程3)
                        MsgBox(0,"",$c)
                        $d=ProcessClose(子进程4)
                        MsgBox(0,"",$d)
                        ……
现在的情况是这样的,如果子进程1234同时存在,那么abcd四个值都为1,成功结束四个子进程
如果中间有某个子进程没有开启的话,中间就会断开,举个例子
比如,四个子进程中,1,3,4开启,2没有开启,那么结束的结果就是1成功,且有返回值,2,3,4失败,且没有返回值

不明白,子进程之间应该是没有联系的啊,为什么要依次结束才能成功,中间断开就回失败呢

renren 发表于 2011-2-11 10:15:12

直接`枚举父进程的子进程 之后在结束子进程呢`?论坛有相关函数了`搜索下

ceoguang 发表于 2011-2-11 16:03:20

ProcessClose(进程名)
改为
ProcessClose(pid)

dearmb 发表于 2011-2-11 23:18:03

回复 2# renren

还没试,主要是还没明白你说的意思
我的理解是中间断开之后的代码并没有执行
因为即使写一条msgbox(0,"","提示")这样的代码都没有弹出

dearmb 发表于 2011-2-11 23:20:23

回复 3# ceoguang

就是照例子改的,$iPidSmall = _CoProc("Small") ;开启子进程,子进程将执行Small()函数,$iPidSmall得到的是子进程的PID
写的就是PID
现在只要是1,2,3,4子进程都存在就会成功,无论是PID还是进程名都会有返回值成功,但是断开以下的句子就不执行了

renren 发表于 2011-2-11 23:35:00

回复 4# dearmb

$aChild = _WinAPI_EnumChildProcess(@AutoItPID)
ProcessClose($aChild)
ProcessClose($aChild)

可以先枚举次 主进程的 子进程出来,得出的数组形式,有多少个`你就结束多少个

dearmb 发表于 2011-2-11 23:42:42

3Q,明天试一下好用不

dearmb 发表于 2011-2-12 07:41:17

回复dearmb

$aChild = _WinAPI_EnumChildProcess(@AutoItPID)
ProcessClose($aChild)
Proces ...
renren 发表于 2011-2-11 23:35 http://autoitx.com/images/common/back.gif

试了,但是提示ERROR: _WinAPI_EnumChildProcess(): undefined function.
找了找也没找到,#Include <WinAPI.au3>也没有用啊
哪个UDF?

renren 发表于 2011-2-12 09:45:56

回复 8# dearmb


    #Include <WinAPIEx.au3>还有个 #Include <Array.au3>

dearmb 发表于 2011-2-12 10:47:29

回复dearmb


    #Include   还有个 #Include
renren 发表于 2011-2-12 09:45 http://autoitx.com/images/common/back.gif


   谢谢,好用了,厉害啊!

还有个问题,我现在是利用fastcopy做的拷贝工具,上面的例子里,子进程1,2,3,4是循环运行的
runwait(“fastcopy.exe ……”
主进程运行子进程,子进程运行fastcopy.exe
现在子进程结束没有问题了,我想把运行起来的fastcopy.exe也一起结束,碰到了同样的问题,有办法解决吗?
runwait获取不到运行起来的PID吧

dearmb 发表于 2011-2-12 11:12:58

哎呀,出现了新的问题
在编辑器下运行没有问题
编译成exe之后,点击x按钮退出提示
Line 12934 (File:……)
Error:子脚本是用了非数组变量

为什么编译成exe就报错了,此外我只有2000多行代码,没有12934那么多阿

renren 发表于 2011-2-12 11:16:57

回复 11# dearmb


    对子进程的存在做个`判断,存在的时候才去结束,要不你点退出就执行`结束所有子进程的函数,都不存在的子进程,没返回数组,当然提示 非数组变量了{:face (383):}

dearmb 发表于 2011-2-12 12:05:00

本帖最后由 dearmb 于 2011-2-12 12:06 编辑

回复dearmb


    对子进程的存在做个`判断,存在的时候才去结束,要不你点退出就执行`结束所有子进程 ...
renren 发表于 2011-2-12 11:16 http://autoitx.com/images/common/back.gif

明白你的意思,但是没有子进程,_WinAPI_EnumChildProcess没有返回值,我不知道该怎么判断有没有子进程在运行……

此外,结束fastcopy进程那些,有办法么?

我的程序在编辑器下运行,速度还可以,但是编译成exe之后运行速度就很慢了,使因为我代码写的不够优化吧?

renren 发表于 2011-2-12 22:03:37

费解迷糊`把你的码`贴出来`大家时间多的话骑几下`看下`吧`这样才可以帮你解决下问题

dearmb 发表于 2011-2-13 07:07:11

费解迷糊`把你的码`贴出来`大家时间多的话骑几下`看下`吧`这样才可以帮你解决下问题
renren 发表于 2011-2-12 22:03 http://autoitx.com/images/common/back.gif

把代码帖出来了,为了多进程,重复的比较多,
现在主要就是
1,没有子进程时点X报错,
2,子进程开启的fastcopy能不能在点X之后一起结束
3,开始运行时比较卡,查看日志时比较卡

谢谢,帮我看看还能不能再改一改
页: [1] 2
查看完整版本: 多进程模拟多线程,ProcessClose结束进程失败(已解决)