ObjShare

包含在多线程环境中使用对象的函数。这对于从不同线程调用类的方法特别有用。可以从多个线程使用此类对象,而不会导致使用 COM 函数崩溃 LresultFromObjectObjectFromLresult.


OutputVar := ObjShare(ObjectOrLresult)
函数示例: Lresult := ObjShare(MyObject)

参数

OutputVar(输出变量)

用于存储为对象或 IDispatch 代理 COM 对象创建的 Lresult 的变量的名称。

ObjectOrLresult(对象或 LRESULT)

要使用的现有对象或结果。
当此参数是对象时,OutputVar 将是 Lresult 值。否则,当 Lresult 传递时,OutputVar 将是 IDispatch 代理 COM 对象

一般备注

AutoHotkey 不是线程安全的,当您在主线程执行代码时从另一个线程执行代码时,将导致访问冲突,并且您的程序将崩溃。

How does ObjShare work:

注意!您无法使用其他线程访问该对象 ahkExec, ahkFunctionahkLabel (GoSub 模式),这将导致 COM 错误。

当创建 lresult 的线程处于关键模式时,您将无法调用 IDispatch 代理 COM 对象,直到线程变为非关键。

要向多个线程共享一个对象,您需要通过多次调用 ObjShare 为每个线程创建一个单独的 lresult。

相关

Object, CriticalObject

示例

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