找回密码
 加入
搜索
查看: 11478|回复: 16

[AU3基础] 多进程模拟多线程,ProcessClose结束进程失败(已解决)

  [复制链接]
发表于 2011-2-11 09:50:12 | 显示全部楼层 |阅读模式
本帖最后由 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失败,且没有返回值

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

本帖子中包含更多资源

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

×
发表于 2011-2-11 10:15:12 | 显示全部楼层
直接`枚举父进程的子进程 之后在结束子进程呢`?论坛有相关函数了`搜索下
发表于 2011-2-11 16:03:20 | 显示全部楼层
ProcessClose(进程名)
改为
ProcessClose(pid)
 楼主| 发表于 2011-2-11 23:18:03 | 显示全部楼层
回复 2# renren

还没试,主要是还没明白你说的意思
我的理解是中间断开之后的代码并没有执行
因为即使写一条msgbox(0,"","提示")这样的代码都没有弹出
 楼主| 发表于 2011-2-11 23:20:23 | 显示全部楼层
回复 3# ceoguang

就是照例子改的,$iPidSmall = _CoProc("Small") ;开启子进程,子进程将执行Small()函数,$iPidSmall得到的是子进程的PID
写的就是PID
现在只要是1,2,3,4子进程都存在就会成功,无论是PID还是进程名都会有返回值成功,但是断开以下的句子就不执行了
发表于 2011-2-11 23:35:00 | 显示全部楼层
回复 4# dearmb

$aChild = _WinAPI_EnumChildProcess(@AutoItPID)
ProcessClose($aChild[1][1])
ProcessClose($aChild[2][1])

可以先枚举次 主进程的 子进程出来,得出的数组形式,有多少个`你就结束多少个
 楼主| 发表于 2011-2-11 23:42:42 | 显示全部楼层
3Q,明天试一下好用不
 楼主| 发表于 2011-2-12 07:41:17 | 显示全部楼层
回复  dearmb

$aChild = _WinAPI_EnumChildProcess(@AutoItPID)
ProcessClose($aChild[1][1])
Proces ...
renren 发表于 2011-2-11 23:35


试了,但是提示ERROR: _WinAPI_EnumChildProcess(): undefined function.
找了找也没找到,#Include <WinAPI.au3>也没有用啊
哪个UDF?
发表于 2011-2-12 09:45:56 | 显示全部楼层
回复 8# dearmb


    #Include <WinAPIEx.au3>  还有个 #Include <Array.au3>
 楼主| 发表于 2011-2-12 10:47:29 | 显示全部楼层
回复  dearmb


    #Include   还有个 #Include
renren 发表于 2011-2-12 09:45



   谢谢,好用了,厉害啊!

还有个问题,我现在是利用fastcopy做的拷贝工具,上面的例子里,子进程1,2,3,4是循环运行的
runwait(“fastcopy.exe ……”
主进程运行子进程,子进程运行fastcopy.exe
现在子进程结束没有问题了,我想把运行起来的fastcopy.exe也一起结束,碰到了同样的问题,有办法解决吗?
runwait获取不到运行起来的PID吧
 楼主| 发表于 2011-2-12 11:12:58 | 显示全部楼层
哎呀,出现了新的问题
在编辑器下运行没有问题
编译成exe之后,点击x按钮退出提示
Line 12934 (File:……)
Error:子脚本是用了非数组变量

为什么编译成exe就报错了,此外我只有2000多行代码,没有12934那么多阿
发表于 2011-2-12 11:16:57 | 显示全部楼层
回复 11# dearmb


    对子进程的存在做个`判断,存在的时候才去结束,要不你点退出就执行`结束所有子进程的函数,都不存在的子进程,没返回数组,当然提示 非数组变量了
 楼主| 发表于 2011-2-12 12:05:00 | 显示全部楼层
本帖最后由 dearmb 于 2011-2-12 12:06 编辑
回复  dearmb


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


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

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

我的程序在编辑器下运行,速度还可以,但是编译成exe之后运行速度就很慢了,使因为我代码写的不够优化吧?
发表于 2011-2-12 22:03:37 | 显示全部楼层
费解迷糊`把你的码`贴出来`大家时间多的话骑几下`看下`吧`这样才可以帮你解决下问题
 楼主| 发表于 2011-2-13 07:07:11 | 显示全部楼层
费解迷糊`把你的码`贴出来`大家时间多的话骑几下`看下`吧`这样才可以帮你解决下问题
renren 发表于 2011-2-12 22:03


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

谢谢,帮我看看还能不能再改一改
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-2 14:25 , Processed in 0.087911 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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