caney 发表于 2008-10-17 09:20:33

如何[解决多进程模拟多线程]程序重复运行问题

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 编辑 ]

liongodmien 发表于 2008-10-17 09:48:06

没明白怎么是多进程!

那不是不能防止程序重复运行,是因为运行了两个进程,按AU3的默认,也就出了两个系统图标!

caney 发表于 2008-10-17 09:52:06

原帖由 liongodmien 于 2008-10-17 09:48 发表 http://www.autoitx.com/images/common/back.gif
没明白怎么是多进程!

那不是不能防止程序重复运行,是因为运行了两个进程,按AU3的默认,也就出了两个系统图标!

是的,系统图标确实有二个。我的困惑在于:再次运行程序,就会再出现两个系统图标,加上原来的二个就有四个啦。

解决程序重复运行的意思是:判断是否已经运行了该程序,如是,结束再次运行的该程序。

也就是不是出现四个、六个。。。。系统图标。

caney 发表于 2008-10-17 09:53:43

测试一下贴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

liongodmien 发表于 2008-10-17 10:55:06

按下面的就可以了,是什么原因我希望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

caney 发表于 2008-10-17 13:56:10

原帖由 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:31

既然不明白,那就不浪费兄弟你宝贵的时间了....

多进程产生的进程,不会因为主进程的退出而退出,这是你原来代码运行后会留下两个图标的原因....

接上,既然主进程已经退出了,那何来窗口标题的判断?!只会继续产生新的子进程...

我加了一个死循环后,主进程就保留了下来,由于没有隐藏图标,于是就有了三个图标了!也正因为主进程还在,那个窗口标题的判断就会产生其应有的效果!

caney 发表于 2008-10-17 14:33:57

原帖由 liongodmien 于 2008-10-17 14:19 发表 http://www.autoitx.com/images/common/back.gif
既然不明白,那就不浪费兄弟你宝贵的时间了....

多进程产生的进程,不会因为主进程的退出而退出,这是你原来代码运行后会留下两个图标的原因....

接上,既然主进程已经退出了,那何来窗口标题的判断? ...

兄弟的解析深入浅出,令我茅塞顿开!~

再次谢谢兄弟的不耐心赐教!

本问题已解决~

UID 发表于 2008-12-25 14:43:27

#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

曼菲士 发表于 2011-3-25 14:44:14

翻旧饭看看。

风尘子 发表于 2011-5-23 21:40:51

欣赏元老的提点

aiwen0092 发表于 2014-12-25 10:58:46

{:face (427):}来学习学习
页: [1]
查看完整版本: 如何[解决多进程模拟多线程]程序重复运行问题