多线程与单线程的区别:

单线程顺序执行:ABCDEFG,HIJKLMN
单线程异步执行:ABC,KLMN,EFGHI,错开执行避免I/O之类的长时间等待卡住线程【WinWait】
多线程:一个进程内可有多个线程ABCDEFG同时执行互不干扰
多进程:创建多个进程ABCDEFG并互相通信,来达到仿多线程的效果。

 

;  【多进程代替多线程函数】 Exec()  By FeiYue   修改优化:dbgba
;
;  使用说明:
;  1、启动进程:Exec(代码,进程标记)
;  2、停止进程:Exec("",进程标记)
;  3、进程标记相同,后启动的进程会替换先启动的进程
;  4、主脚本退出时,主脚本启动的所有进程都会被清理

; 如果是编译后运行,需要电脑安装ahk和此脚本提权到管理员

;-- 这是一行的写法
F1::Exec("Loop{`nSleep,100`nMouseGetPos,x,y`nToolTip,F1-%A_Index%,x+10,y-30`n}", 1)

;-- 这是多行的写法,括号中可以原样粘贴要运行的代码
F2::
s=
(` %
  Loop {
    Sleep, 100
    MouseGetPos, x, y
    ToolTip, F2-%A_Index%, x+10, y+10
  }
)
;-- 使用开关变量来一键切换启动和停止
; (ok:=!ok) ? Exec(s,2) : Exec("",2)
Exec(s, 2)
return

;-- 清理进程
F3::Exec("", 1), Exec("", 2)


Exec(s, flag="Default", Timeout=30) {
  Static PIDLabel := DllCall("GetCurrentProcessId")
  SetBatchLines -1
  SetWorkingDir %A_ScriptDir%
  add=`nflag=<<ExecNew%PIDLabel%%flag%>>`n
  (%
  Gui, Gui_Flag_Gui: Show, Hide, %flag%
  与进程同步退出(PID:="") {
    Static init:=与进程同步退出(_HostProcessID)
    if (PID="")
      ExitApp
    else
      DllCall("RegisterWaitForSingleObject", "Ptr*", 0, "Ptr", DllCall("OpenProcess", "Uint", 0x100000, "int", False, "Uint", PID, "Ptr"), "Ptr", RegisterCallback("与进程同步退出", "F"), "Ptr", 0, "Uint", -1, "Uint", 8)
  }
  )
  DetectHiddenWindows % ("On", DHW:=A_DetectHiddenWindows)
  WinGet, NewPID, PID, <<ExecNew%PIDLabel%%flag%>> ahk_class AutoHotkeyGUI
  SendMessage, 0x111, 65307,,, %A_ScriptDir%\* ahk_pid %NewPID%
  exec := ComObjCreate("WScript.Shell").Exec(A_AhkPath " /ErrorStdOut /force *")
  , exec.StdIn.Write(StrReplace(add, "_HostProcessID", PIDLabel) "`n" s "`nExitApp")
  , exec.StdIn.Close()
  if (s!="")
    Loop % Timeout*1000//15
      Sleep 15
    Until WinExist("<<ExecNew" PIDLabel . flag ">> ahk_pid " exec.ProcessID)
  DetectHiddenWindows %DHW%
  Return exec.ProcessID
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。