一直以来Autoit都不支持多线程,因此一些需要同时运行多个循环的操作也就无法实现。这个问题在其它的某些语言里也经常出现,解决的方法就是使用多进程。 所谓多进程,就是同时运行多个子进程,每个子进程负责不同的操作,藉此达到和多线程相当的效果。Autoit本身已经具备了实现多进程的条件,且已经有人完成了相关的自定义函数。下面我将具体讲解如何利用这些自定义函数实现多进程。 首先到 http://www.autoitscript.com/foru ... 29326&hl=CoProc 下载CoProc.zip,压缩包里的CoProc.au3包含了实现多进程的相关函数,你可以把这个文件复制到Include目录下。 函数使用说明: _CoProc() 这个函数的作用是启动自己的子进程,然后执行指定的函数。比方说如果你想另开一个进程执行“fuck”函数,代码写_CoProc("fuck")就行了。这个函数会返回子进程的PID,在对子进程进行操作时会用到这个PID。另外,你可以无限制开启子进程,且每个子进程都可以建立完全独立的GUI。 _ProcSuspend() & _ProcResume() 暂停/恢复进程。如果你开了一个子进程专门下载文件,就可以利用这两个函数暂停/继续下载。范例:_ProcSuspend(@PID) 。 _CloseHandle() 关闭子进程。范例:_CloseHandle(@PID) 。 _CoProcSend() 向指定进程发送消息。当子进程有新的信息(比如完成下载)需要提示母进程时,就可以使用这个函数。范例:_CoProcSend($PID, "发送的消息内容")。 _CoProcReciver() 注册一个函数用于接收其他进程用_CoProcSend函数传递过来的消息,每当收到消息时注册的函数就会被执行。需要注意的是,被注册的函数必须有且只有一个自定义参数,而传递的参数里就是发送过来的消息。范例:_CoProcReciver("函数名称")。 例子:

  1. #NoTrayIcon
  2. #include "CoProc.au3"
  3. #region 主程序区域
  4. #include <GUIConstants.au3>
  5. $Form1 = GUICreate("Multiple File Download", 622, 119, 192, 125)
  6. GUICtrlCreateLabel("http://www.mv.com/test/paths.txt (1Mb)", 8, 8)
  7. GUICtrlCreateLabel("http://support.shaw.ca/troubleshooting/files/download.dat (20Mb)", 8, 48)
  8. $Progress1 = GUICtrlCreateProgress(8, 24, 601, 17)
  9. $Progress2 = GUICtrlCreateProgress(8, 64, 601, 17)
  10. $Button1 = GUICtrlCreateButton("Pause", 8, 88, 81, 25)
  11. $Button2 = GUICtrlCreateButton("Resume", 96, 88, 81, 25)
  12. $iPidSmall = _CoProc("Small") ;开启子进程,子进程将执行Small()函数,$iPidSmall得到的是子进程的PID
  13. $iPidBig = _CoProc("Big")
  14. GUISetState(@SW_SHOW)
  15. _CoProcReciver("Reciver") ;注册Reciver()函数来接收子进程传递过来的消息
  16. While 1
  17. $msg = GuiGetMsg()
  18. Select
  19. Case $msg = $GUI_EVENT_CLOSE
  20. ExitLoop
  21. Case $msg = $Button1
  22. _ProcSuspend($iPidSmall) ;暂停$iPidSmall这个子进程
  23. _ProcSuspend($iPidBig)
  24. Case $msg = $Button2
  25. _ProcResume($iPidSmall) ;恢复$iPidSmall子进程
  26. _ProcResume($iPidBig)
  27. Case Else
  28. ;
  29. EndSelect
  30. WEnd
  31. FileDelete(@TempDir & "smalltest.tmp")
  32. FileDelete(@TempDir & "bigtest.tmp")
  33. Exit
  34. Func Reciver($vParameter)
  35. ;$vParameter里就是子进程发来的消息
  36. $aParam = StringSplit($vParameter,"|")
  37. If $aParam[1] = "small" Then GUICtrlSetData($Progress1,$aParam[2])
  38. If $aParam[1] = "big" Then GUICtrlSetData($Progress2,$aParam[2])
  39. EndFunc
  40. #endregion
  41. #region Small()函数里是'Small file'子进程的所要执行的代码
  42. Func Small()
  43. $url = "http://www.mv.com/test/paths.txt"
  44. $size = InetGetSize($url)
  45. InetGet($url,@TempDir & "smalltest.tmp",1,1)
  46. While @InetGetActive And ProcessExists($gi_CoProcParent)
  47. ;在下载时不断向父进程发送下载进度,$gi_CoProcParent是父进程的PID,这个变量是函数自己建立的
  48. _CoProcSend($gi_CoProcParent,"small|" & Round(@InetGetBytesRead / $size * 100,0))
  49. Sleep(250)
  50. WEnd
  51. _CoProcSend($gi_CoProcParent,"small|100")
  52. EndFunc
  53. #endregion
  54. #region 'Big file'子进程执行的代码
  55. Func Big()
  56. $url = "http://support.shaw.ca/troubleshooting/files/download.dat"
  57. $size = InetGetSize($url)
  58. InetGet($url,@TempDir & "bigtest.tmp",1,1)
  59. While @InetGetActive And ProcessExists($gi_CoProcParent)
  60. _CoProcSend($gi_CoProcParent,"big|" & Round(@InetGetBytesRead / $size * 100,0))
  61. Sleep(250)
  62. WEnd
  63. _CoProcSend($gi_CoProcParent,"big|100")
  64. EndFunc
  65. #endregion

复制代码

注意事项: 子进程发送消息时需要母进程的PID,而母进程的PID储存在$gi_CoProcParentli里 子进程可以正常使用脚本里的所有自定义函数 在子进程执行的那个函数里你不能再#include函数库或是用Func定义函数 对一个子进程不要重复使用_ProcSuspend()和_ProcResume() 函数,否则会让子进程无响应

Autoit里用多进程模拟多线程的更多相关文章

  1. PHP中利用pcntl实现多进程(模拟多线程)实例(转)

    windows不支持pcntl的多线程(非Unix类系统不支持此模块),pcntl在很久很久之前就听过了,但是一直没有尝试着真正要用它. 这不,遇到socket问题了,看socket,遇到pcntl了 ...

  2. Python3 多进程和多线程

    Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为 ...

  3. python多进程与多线程编程

    进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...

  4. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

  5. php模拟多线程

    一:应该知道的: php本身是不支持多线, 但是php的好搭档,apache和linux是支持的,故lamp才是最佳组合,还在使用win服务器的现在知道为什么要用linux吧.既然是模拟的, 就不是真 ...

  6. shell 中用管道模拟多线程

    shell 中用管道模拟多线程 这里以两个例子来对比多线程和单进程 单线程的例子 # config.txt在这个例子和多线程的例子中都会用到 [root@ns_10.2.1.242 test]$ ca ...

  7. 多CPU,多核,多进程,多线程

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位(调度单位). 3.一个进程可以包括多个线程. 4.在 ...

  8. python 多进程和多线程的区别

    了解线程和进程 进程 程序:磁盘上的可执行二进制文件,并无运行状态. 进程:就是一个正在运行的任务实例(存活在内存里). 获取当前电脑的CPU核心数: pip install psutil >& ...

  9. Python 多进程、多线程效率比较

    Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程.本篇来作个比较. 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 ...

随机推荐

  1. c++开源库rapidxm

    1.引入头文件: 一般用到的头文件: #include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_utils ...

  2. SpringBoot与Shiro整合

    一.数据库设计 ​ 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表(角色和权限是多对多的).表结构建立的sq ...

  3. ThinkPHP3.2.2的函数扩展

    ThinkPHP的函数扩展:为了更好的在前台模板中显示变量,例如,商品分类中,分类名称之间的缩进.此时,在APP/Common/Common文件夹下(APP为新建的应用目录),新建一个php文件,如: ...

  4. L3-022 地铁一日游

    floyd算法建立新图,dfs标记~ #include<bits/stdc++.h> using namespace std; ; const int inf=1e9; int d[max ...

  5. [WC2018]州区划分(状压,子集卷积)

    [洛谷题面]https://www.luogu.org/problemnew/show/P4221 首先考虑判定一个子图是否合法: (1)连通:并查集判断即可. (2)没有欧拉回路:存在欧拉回路的条件 ...

  6. 树莓派4B踩坑指南 - (8)安装GO语言

    下载 191129最新版本为go1.13.4.linux-armv6l.tar.gz go官网(点此访问)国内访问似乎不是很稳定,但下载速度还挺快,下载地址:(点此访问) 安装 解压后是一个名为go的 ...

  7. Python开发:变量类型

    1.变量赋值 #!/usr/bin/python # -*- coding: UTF-8 -*- counter = 100 # 赋值整型变量 miles = 1000.0 # 浮点型 name = ...

  8. 1-使用React的方式

    认识 React React是一个用于构建用户界面的 JAVASCRIPT 库.(JQuery也是) React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图).mvvm Rea ...

  9. spring boot中的底层配置文件application.yam(application.property)的装配原理初探

    *在spring boot中有一个基础的配置文件application.yam(application.property)用于对spring boot的默认设置做一些改动. *在spring boot ...

  10. oracle SQL 练习

    COURSE 表 DROP TABLE "SCOTT"."course"; CREATE TABLE "SCOTT"."cours ...