多线程与单线程的区别:

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

 

; V1_H版API介绍:https://www.ahk66.com/ahkh_docs/AutoHotkey.htm

; /*
;~ 例5
;~ 线程中的函数返回值是对象
代码=
( ` %
#Persistent
Func(b) {
  b:=Object(b)  ; 创建关联数组
  MsgBox, % "新线程函数返回值:" b["键值"]
  b["键值"]:="str2"  ; 此时传入线程中的obj的值已经发生改变,故曲线实现了返回值是对象的目的。
}
)

obj:=[], obj["键值"]:="str1"
线程1:=AhkThread(代码)
;~ 正确写法是这样的,必须在“&obj”后面加上双引号,强制转换为字符串,否则报错。
线程1.ahkFunction("Func", &obj "")
if (obj["键值"]!="str1")
  MsgBox, % "主线程读取值:" obj["键值"]
 else
  MsgBox 0x10, , ××新线程启动失败××, 1
*/


/*
;~ 例6
;~ 多个线程共同安全地操作同一个对象
代码=
(
#Persistent
新线程函数(b)
{
  b:=CriticalObject(b)  ; 共享对象【H版语法】
  Loop, 100
    b.Push(A_Index) ; 追加一个或多个值到数组的尾部.
}
)
obj:="", obj:=CriticalObject()
t1:=AhkThread(代码)
t2:=AhkThread(代码)
t1.ahkPostFunction("新线程函数", &obj "")
t2.ahkPostFunction("新线程函数", &obj "")
Sleep 10  ; 等待2个线程写入数据完毕
MsgBox % obj.MaxIndex()  ; 这里会显示200,说明每个线程各写入了100个
*/

/*
;~ 例7 【官方原版示例】

; 天黑 对V1H的CriticalObject()不安全的解释:【自测Loop各一万次没问题】
; 比如存字符串的时候,需要释放旧的再分配新的,两个线程同时搞可能会把同一个字符串释放了2次,就崩了

obj := CriticalObject() ; 创建新的关键对象

Loop 4  ; 创建4个线程,同时向obj数组赋值【此示例不适合转成=()】
    AhkThread%A_Index% := AhkThread("obj:=CriticalObject(" (&obj) ")`n Loop `n obj[" A_Index "]:= A_Index")

Loop ; 显示对象的当前内容
    ToolTip % obj[1] "`n" obj[2] "`n" obj.3 "`n" obj.4  ; 数组读取等效写法

Esc::ExitApp

*/


/*
;~ 例1
;~ 启动新线程的方法,以下代码会同时弹出“t1”“t2”“haha”
t1:=AhkThread("msgbox, t1")
t2:=AhkThread("msgbox, t2")
MsgBox, haha - 主线程弹窗,点击后其它线程同步关闭
*/


/*
;~ 例2
;~ “.ahkFunction()”会卡住,但有函数返回值。
;~ “.ahkPostFunction()”不会卡住,但没有函数返回值。
代码=
(
#Persistent
a(b, c)
{
  MsgBox, `%b`%
  return, c
}
)
t1:=AhkThread(代码)
t2:=AhkThread(代码)
t3:=AhkThread(代码)
;~ 此处会卡住
t1.ahkFunction("a", "t1", 88)
;~ 此处会卡住显示“t2”,点击确认按钮后会显示正确的返回值“99”
MsgBox, % ret:=t2.ahkFunction("a", "t2", 99)
;~ 此处会同时显示“t3”(函数运行过程)和“0”(函数的返回值,表示运行正常)
MsgBox, % ret:=t3.ahkPostFunction("a", "t3", 00)
;~ 最后显示
MsgBox, haha
*/

;~ 例3
;~ 例2中线程代码里“#Persistent”的存在,导致3个线程都不会自己退出!如果不加“#Persistent”,后面“.ahkFunction()”或“.ahkPostFunction()”又会失败。
;~ 例2中“.ahkFunction()”或“.ahkPostFunction()”传递的参数永远只能是字符串或数字。
;~ 例2中“.ahkFunction()”的返回值永远是且只是字符串,也就是说要返回对象或者数字都需要单独处理。

/*
;~ 例4
;~ 传递对象给线程中的函数
代码=
(
#Persistent
a(b)
{
  b:=Object(b)
  MsgBox, `% "新线程:" b["a", "b"]
}
)
;~ 注意“obj:=[]”必须有,否则后面的对象值也创建不了
obj:=[], obj["a", "b"]:="str1"
t1:=AhkThread(代码)
;~ 唯二正确的写法是这样的
;~ t1.ahkFunction("a", &obj "")
中介obj:=Object(obj)
t1.ahkFunction("a", 中介obj)
;~ 特别注意,以下这种写法依然是错误的!!!!!!
;~ “t1.ahkFunction("a", Object(obj))”
*/

 

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