« 10.1还是决定回家了 | (回到Blog入口) | 2008北京perlchina大会见闻!(旅行篇) »

用perl实现WIN下第三方程序的后台运行

因为一个项目的需求,要同时运行几个第三方程序,因为程序一旦开启就不会退出,所以使用open,system和``直接执行第三方程序的话是会让perl的程序一直处于等待状态,如果想让Perl的程序能顺利结束就得使用第三方的程序能在后台运行从而让Perl认为程序已经正常运行完毕,从而继续执行下面的代码。

如果在LINUX下,这个文件很容易解决,直接在运行的程序命令后面加&就可以了,但翻遍WIN的CMD命令则没有发现有相关的选项,弄了一天也没什么结果,晚上下班回家,和同事边走边聊,告诉我WIN API中的CreateProcess可以解决该问题,于是回家继续翻出CPAN查找WIN32和API相关的模块,可惜的是WIN32和WIN32::API模块都没有该方法。
于是继续找,翻到了早上已经看过的Win32::Process
使用起来也很简单
Win32::Process::Create($ProcessObj,
                                "C:\\winnt\\system32\\notepad.exe",
                                "notepad temp.txt",
                                0,
                                NORMAL_PRIORITY_CLASS,
                                ".")|| die ErrorReport();


执行该代码后跳出一个记事本出来,虽然满足了我运行程序的条件,但不能满足我集成的条件-不显示第三方的程序,于是详细看了下文档,文档中说create的第5个参数是可以指定的,于是立马找该参数的详细设定,找到一个CREATE_NO_WINDOW,顾名思义,就是创建的进程是没有窗口的,但是使用该参数还是必须要第三方程序运行完才能执行下面的代码,而CREATE_NEW_CONSOLE虽然可以在第三方程序运行时就继续执行下面的代码,但会开启一个新的窗口出来
其实不是不能用线程来解决,但因为该程序可能会不断的开启和关闭第三方的程序,而perl的线程处理如果不好,内存浪费是很严重的,所以还是看下有没更简单点的办法
继续往下看DETACHED_PROCESS,哈哈,看名字难道就是我要找的吗?
执行了一下,果然既不出第三方窗体,而且第三方程序运行的时候也会继续执行下面的代码
至此我要的功能完成
以下是我的测试代码,执行一个ping的命令并在命令还在运行的时候返回其PID

   Win32::Process::Create($ProcessObj,
                                "C:\\WINDOWS\\system32\\ping.exe",
                                "ping 192.168.0.1",
                                0,DETACHED_PROCESS,".")|| die ErrorReport();

    print $ProcessObj->GetProcessID();

引用通告

TrackBack URL for this entry:
如果您想引用这篇文章到您的Blog,
请复制下面的链接,并放置到您发表文章的相应界面中。
http://playcat.net/mt-tb.cgi/72

发表一个评论

(如果你此前从未在此 Blog 上发表过评论,则你的评论必须在 Blog 主人验证后才能显示,请你耐心等候。)

关于

此页面包含了发表于2008年10月20日 21:19的 Blog 上的单篇日记。

此 Blog 的前一篇日记是 10.1还是决定回家了

此 Blog 的后一篇日记是 2008北京perlchina大会见闻!(旅行篇)

更多信息可在 主索引 页和 归档 页看到。

Creative Commons License
此 Blog 中的日记遵循以下授权 Creative Commons(创作共用)授权.
Powered by
Movable Type 6.3.2