包含在多线程环境中使用对象的函数。这对于从不同线程调用类的方法特别有用。可以从多个线程使用此类对象,而不会导致使用 COM 函数崩溃 LresultFromObject 和 ObjectFromLresult.
OutputVar := ObjShare(ObjectOrLresult)函数示例: Lresult := ObjShare(MyObject)
用于存储为对象或 IDispatch 代理 COM 对象创建的 Lresult 的变量的名称。
要使用的现有对象或结果。
当此参数是对象时,OutputVar 将是 Lresult 值。否则,当 Lresult 传递时,OutputVar 将是 IDispatch 代理 COM 对象
AutoHotkey 不是线程安全的,当您在主线程执行代码时从另一个线程执行代码时,将导致访问冲突,并且您的程序将崩溃。
How does ObjShare work:
注意!您无法使用其他线程访问该对象 ahkExec, ahkFunction 或 ahkLabel (GoSub 模式),这将导致 COM 错误。
当创建 lresult 的线程处于关键模式时,您将无法调用 IDispatch 代理 COM 对象,直到线程变为非关键。
要向多个线程共享一个对象,您需要通过多次调用 ObjShare 为每个线程创建一个单独的 lresult。
t:=new Test(), lresult := ObjShare(t) ; 创建 lresult 以在不同线程中使用
AhkThread("
(
t := ObjShare(" lresult ") ; 创建 IDispatch 代理 COM 对象
Loop {
t.CheckBox()
Sleep 10
}
)")
Loop {
t.Slider()
Sleep 10
}
Class Test {
__New(p*){
Gui, test:New, HWNDhwnd
Gui, Add, Slider, hwndSliderhwnd, 0
this.slidervalue:=0
this.checkvalue:=0
Gui, Add, Checkbox, hwndCheckBoxhwnd
Gui, Show, w200 h100
this.checkBoxhwnd:=checkboxhwnd
this.sliderhwnd:=sliderhwnd
this.hwnd:=hwnd
}
CheckBox(){
Gui, test:Default
GuiControl,,% this.checkboxhwnd,% this.checkvalue:=!this.checkvalue
}
Slider(){
Gui, test:Default
GuiControl,,% this.Sliderhwnd,% this.slidervalue=100?this.slidervalue:=0:++this.slidervalue
}
}
TestGuiClose:
ExitApp