如何[解决多进程模拟多线程]程序重复运行问题
Autoit里用多进程模拟多线程参考:http://www.autoitx.com/forum.php?mod=viewthread&tid=475&extra=page%3D2
测试代码 如下:
#include "CoProc.au3"
$g_szVersion = "Test"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
_CoProc("Test_1")
_CoProc("Test_2")
Func Test_1()
While 1
MsgBox(0, '', "This is Test_1")
Sleep(5000)
Wend
EndFunc
Func Test_2()
While 1
MsgBox(0, '', "This is Test_2")
Sleep(5000)
Wend
EndFunc
结果是:
$g_szVersion = "Test"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
无法正常工作,不会中止程序重复运行。
BTW:帖子编辑那里有au3脚本插入器,本想把这种au3代码用它粘贴到帖子中去,以便观看。但我无法正常使用它,现象是在编辑时点不动,字体、大小等一样点不动。不晓得是否权限问题?
已自行解决 贴au3脚本的问题。即 手动 输入"(au3)...代码(/au3)" 小括号改为中括号即可
[ 本帖最后由 caney 于 2008-10-17 14:34 编辑 ] 没明白怎么是多进程!
那不是不能防止程序重复运行,是因为运行了两个进程,按AU3的默认,也就出了两个系统图标! 原帖由 liongodmien 于 2008-10-17 09:48 发表 http://www.autoitx.com/images/common/back.gif
没明白怎么是多进程!
那不是不能防止程序重复运行,是因为运行了两个进程,按AU3的默认,也就出了两个系统图标!
是的,系统图标确实有二个。我的困惑在于:再次运行程序,就会再出现两个系统图标,加上原来的二个就有四个啦。
解决程序重复运行的意思是:判断是否已经运行了该程序,如是,结束再次运行的该程序。
也就是不是出现四个、六个。。。。系统图标。 测试一下贴AU3码
#include "CoProc.au3"
$g_szVersion = "Test"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
_CoProc("Test_1")
_CoProc("Test_2")
Func Test_1()
While 1
MsgBox(0, '', "This is Test_1")
Sleep(5000)
Wend
EndFunc
Func Test_2()
While 1
MsgBox(0, '', "This is Test_2")
Sleep(5000)
Wend
EndFunc
按下面的就可以了,是什么原因我希望LZ能自己想一想:
#include "CoProc.au3"
$g_szVersion = "Test_Check"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
_CoProc("Test_1")
_CoProc("Test_2")
Do
Sleep(90)
Until 0
Func Test_1()
While 1
MsgBox(0, '', "This is Test_1")
Sleep(5000)
Wend
EndFunc
Func Test_2()
While 1
MsgBox(0, '', "This is Test_2")
Sleep(5000)
Wend
EndFunc
原帖由 liongodmien 于 2008-10-17 10:55 发表 http://www.autoitx.com/images/common/back.gif
按下面的就可以了,是什么原因我希望LZ能自己想一想:
......
Do
Sleep(90)
Until 0
......
谢谢不吝赐教,对于兄弟这段代码:
......
Do
Sleep(90)
Until 0
......
虽不甚明了,但也有尝试。
结果是首次运行即有三个系统图标;重复运行,还是三个系统图标,没有变成四个或六个系统,已经很安慰。
总觉代码还是不怎么完善。
望兄弟提壶灌顶。。
[ 本帖最后由 caney 于 2008-10-17 13:57 编辑 ] 既然不明白,那就不浪费兄弟你宝贵的时间了....
多进程产生的进程,不会因为主进程的退出而退出,这是你原来代码运行后会留下两个图标的原因....
接上,既然主进程已经退出了,那何来窗口标题的判断?!只会继续产生新的子进程...
我加了一个死循环后,主进程就保留了下来,由于没有隐藏图标,于是就有了三个图标了!也正因为主进程还在,那个窗口标题的判断就会产生其应有的效果! 原帖由 liongodmien 于 2008-10-17 14:19 发表 http://www.autoitx.com/images/common/back.gif
既然不明白,那就不浪费兄弟你宝贵的时间了....
多进程产生的进程,不会因为主进程的退出而退出,这是你原来代码运行后会留下两个图标的原因....
接上,既然主进程已经退出了,那何来窗口标题的判断? ...
兄弟的解析深入浅出,令我茅塞顿开!~
再次谢谢兄弟的不耐心赐教!
本问题已解决~ #include "CoProc.au3"
#include <GUIConstants.au3>
$g_szVersion = "多进程测试"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
_CoProc("Test_1")
_CoProc("Test_2")
;下面这个主循环是为了不让程序重复运行而写的,原因如下:
#cs
多进程产生的进程,不会因为主进程的退出而退出,这是代码运行后会留下两个图标的原因
既然主进程已经退出了,就不会有窗口标题的判断,只会继续产生新的子进程
加了一个死循环后,主进程就保留了下来,由于没有隐藏图标,于是就有了三个图标了
也正因为主进程还在,窗口标题的判断就会产生其应有的效果
#CE
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case Else
;
EndSelect
WEnd
Func Test_1()
Local $IsQuit=0
While 1
$IsQuit=MsgBox(4097, '', "这是进程1产生的对话框"&@CRLF&@CRLF&"继续请按确定"&@CRLF&@CRLF&"退出请按取消")
If $IsQuit==2 Then Return 1 ;如果用户不在对话框按下CANCEL键,就继续
Sleep(1000)
Wend
EndFunc
Func Test_2()
Local $IsQuit=0
While 1
$IsQuit=MsgBox(4097, '', "这是进程2产生的对话框"&@CRLF&@CRLF&"继续请按确定"&@CRLF&@CRLF&"退出请按取消")
If $IsQuit==2 Then Return 1 ;如果用户不在对话框按下CANCEL键,就继续
Sleep(1000)
Wend
EndFunc 翻旧饭看看。 欣赏元老的提点 {:face (427):}来学习学习
页:
[1]