gpt4 book ai didi

multithreading - 使用 AHK_H v2,如何让多个线程共享和更新同一个变量?

转载 作者:行者123 更新时间:2023-12-03 12:58:28 32 4
gpt4 key购买 nike

我很失落。这不可能吗?
我需要的:
主脚本.ahk:

LastThing := ""

ThreadsArray := []

Loop %thisMany%{
threads.Push(NewThread("Second script"))
}

---Do Stuff with LastThing---
SecondScript.ahk:
---Get last thing and put it in LastThing---
我拥有的:
主脚本.ahk:
LastThing := ""
SecondScriptSrc := FileRead("SecondScript.ahk", "`n")

dllpath:=A_AhkDir "\AutoHotkey.dll"
DllCall("LoadLibrary","Str",dllpath)
DllCall(dllpath "\ahktextdll","Str","","Str","","PTR")
DllCall(dllpath "\ahkassign", "Str", "LastThing", "Str", LastThing, "CDecl")
DllCall(dllpath "\ahkExec","Str",SecondScriptSrc,"CDecl")

LastThing := DllCall(dllpath "\ahkgetvar","Str", "LastThing", "UInt", 1, "Cdecl Str")
SecondScript.ahk
dllpath:=A_AhkDir "\AutoHotkey.dll"
DllCall("LoadLibrary","Str",dllpath)
LastThing := DllCall(dllpath "\ahkgetvar","Str", "LastThing", "UInt", 1, "Cdecl Str")
LastThing := "thing"
DllCall(dllpath "\ahkassign", "Str", "LastThing", "Str", LastThing, "CDecl")
这就是文档使它看起来像我应该如何做的。
消息框显示看起来很像指针的随机数。
我傻吗?
编辑:如果这是不可能的,那么 ahkassign 和 ahkgetvar 的意义何在?对我来说,ahkgetvar 的文档确实让您看起来可以执行一个线程,然后从该线程中检索一个变量。
dllpath:=A_AhkDir "\AutoHotkey.dll"
DllCall("LoadLibrary","Str",dllpath) ; Load the AutoHotkey module.
DllCall(dllpath "\ahktextdll","Str","","Str","","CDecl") ; start a new thread from file.
DllCall(dllpath "\ahkassign","Str","var","Str","value","CDecl") ; assing value to var
MsgBox DllCall(dllpath "\ahkgetvar","Str","var","UInt",0,"CDecl") ; wait for the thread to exit

最佳答案

我真的无法理解你想用你的代码做什么,但我可以回答你的问题的标题。
所以首先介绍一下 AHK_H v2 文档,不要太当真。它真的已经过时了,您在尝试运行示例脚本等时很容易出错。不过,提供的 chm 文件比在线文档要好一些。
然后关于您的脚本,DllCalling 似乎不太好,但最好不要使用它。
没有必要。
这是一个完整的工作脚本,我将在下面解释它:

MyObj := CriticalObject({"count": 0})

thread2 := AhkThread("
(
index := 0
MyObj := CriticalObject(A_Args[1])
Loop
{
MyObj.count++
index := A_Index
Sleep(10)
}
)", &MyObj "")

thread3 := AhkThread("
(
index := 0
MyObj := CriticalObject(A_Args[1])
Loop
{
MyObj.count++
index := A_Index
Sleep(50)
}
)", &MyObj "")

Sleep(Random(500, 2000))
MsgBox("Count: " MyObj.count "`nIterations In Thread2: " thread2.ahkgetvar("index", 0) "`nIterations In Thread3: " thread3.ahkgetvar("index", 0))
所以,首先我们创建一个 critical object .这只是一个具有一个属性的简单对象, count .
然后我们用 ahkThread() 启动一个新线程.我采用了将简单脚本作为纯文本写入第一个参数的方法。
如果你不熟悉
"
(
text
text
text
")
符号,这就是所谓的 continuation section .
它只是让我们省去了用 `n 写长行的麻烦。 s。
然后对于第二个参数( &MyObj "" ),它将一个值传递给 A_Args ,正如文档所指定的,我传入了关键对象的指针 MyObj (请注意,用于检索指针的 & 前缀在 AHK v2 中不可用,但在 AHK_H v2 中可用)。
而且我将指针与一个空字符串连接起来(基本上将其转换为字符串)。这只是您需要做的事情,以避免它被自动执行 StrGet 'd。
在我们启动的新线程中,我们创建了一个局部变量 index这只是要计算线程已经完成了多少循环。
然后我们通过引用我们传递给 A_Args 的指针再次得到我们的关键对象。 .
然后循环会一直运行,并增加全局计数器 MyObj.count ,和本地柜台 index . ahkThread()的返回值函数存储到变量 thread2所以我们稍后会使用 documentation 中指定的许多有用方法之一。 .
然后我们开始另一个线程,只是我们上面所做的复制粘贴。
然后我们在 500 到 2000 毫秒之间随机休眠一段时间。
然后我们打印一个消息框,显示全局计数器和两个本地计数器。
本地计数器应与全局计数器的值相加。
本地计数器的值 index使用 .ahkgetvar() 从线程中检索我们之前保存的线程对象( thread2thread3 )上的方法。 0 (false) 在第二个参数上指定以指示返回值而不是指针。

关于multithreading - 使用 AHK_H v2,如何让多个线程共享和更新同一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62684725/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com