#SingleInstance Force
;使用大神thqby的AutoHotkey_H v2版本,最大的好处是兼容了主线版本AutoHotkey v2,又结合了很多硬核功能
;本次仅对多线程中的Worker进行演示
;https://www.autohotkey.com/boards/viewtopic.php?f=65&t=125441
;AutoHotkey_H v2简单使用说明:到论坛或Github下载压缩包后,解压到AutoHotkey v2的安装目录
^1:: TestMThread()
^2:: TestMThread2()
TestMThread() {
code := "
(
Persistent()
GlobalVar:="原先值"
loop 5{
Sleep 100
ToolTip "执行中"
}
ToolTip
thread_func(a,b){
return a+b
}
thread_func_by_obj(obj){
return obj.a + obj.b
}
)"
t := A_TickCount
;开始一个新线程
wk := Worker(code)
;关联一个旧线程
; wk2:= Worker(wk.ThreadID)
;等待线程执行一定的时间,不阻塞线程
;0表示未完成,超时退出,1表示完成未超时
MsgBox(wk.Wait(2000) ? "正常完成" : "超时退出")
MsgBox("执行时长:" A_TickCount - t)
;线程取值与赋值(可赋值对象)
MsgBox(wk['GlobalVar'])
arr := Map()
arr["id"] := "新赋值"
wk['GlobalVar'] := arr
MsgBox(wk['GlobalVar']['id'])
;获取线程状态
;0执行完成
;1正在执行中
MsgBox(wk.Ready ? "执行中" : "已完成")
;异步调用,参数1是要调用的线程中的函数,参数2-参数n是函数的传参
wk.AsyncCall('thread_func', 1, 2).Then(CallbackFunc)
wk.AsyncCall('thread_func_by_obj', { a: 1, b: 2 }).Then(CallbackFunc)
;与主线程变量进行引用赋值
Alias(baseThreadVar := "", ahkGetVar('GlobalVar', 1, wk.ThreadID))
baseThreadVar := { new: "对象赋值" }
MsgBox(wk['GlobalVar'].new)
;强制结束线程中的脚本,功能与主线程脚本相同
;若正常退出或强制退出后,调用函数或取值赋值都会报错 Error: (0x80010012) 被呼叫方(服务器 [不是服务器应用程序])不可用并已消失。所有连接均无效。没有执行呼叫。
;异步调用函数之后,若执行之后,异步函数会终止
; wk.ExitApp()
}
CallbackFunc(returnvar) {
MsgBox("回调结果:" returnvar)
}
;在Worker.Wait时,可使用快捷键等方式进行伪线程
TestMThread2() {
MsgBox("伪线程响应")
}
09-22
334
