多线程与单线程的区别:
单线程顺序执行: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))” */
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)