AutoHotkey_H 真多线程Demo

#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("伪线程响应")
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值