Autoit里用多进程模拟多线程

简介: 一直以来Autoit都不支持多线程,因此一些需要同时运行多个循环的操作也就无法实现。这个问题在其它的某些语言里也经常出现,解决的方法就是使用多进程。 所谓多进程,就是同时运行多个子进程,每个子进程负责不同的操作,藉此达到和多线程相当的效果。
 
一直以来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() 函数,否则会让子进程无响应
目录
相关文章
|
25天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
39 1
|
4天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
8天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
5天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
14 1
|
11天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
25 2
|
12天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
1月前
|
存储 消息中间件 人工智能
进程,线程,协程 - 你了解多少?
本故事采用简洁明了的对话方式,尽洪荒之力让你在轻松无负担的氛围中,稍微深入地理解进程、线程和协程的相关原理知识
40 2
进程,线程,协程 - 你了解多少?
|
23天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
25天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第15天】进程、线程和协程是操作系统中三种不同的执行单元。进程是资源分配和调度的基本单位,每个进程有独立的内存空间;线程是进程内的执行路径,共享进程资源,切换成本较低;协程则更轻量,由用户态调度,适合处理高并发和IO密集型任务。进程提供高隔离性和安全性,线程支持高并发,协程则在资源消耗和调度灵活性方面表现优异。
44 2
|
1月前
|
算法 安全 调度
深入理解操作系统:进程与线程的管理
【10月更文挑战第9天】在数字世界的心脏跳动着的,不是别的,正是操作系统。它如同一位无形的指挥家,协调着硬件与软件的和谐合作。本文将揭开操作系统中进程与线程管理的神秘面纱,通过浅显易懂的语言和生动的比喻,带你走进这一复杂而又精妙的世界。我们将从进程的诞生讲起,探索线程的微妙关系,直至深入内核,理解调度算法的智慧。让我们一起跟随代码的脚步,解锁操作系统的更多秘密。
35 1