• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.05
软件大小:21.6M
更新时间:07-04

按键精灵安卓版
立即下载

软件版本:3.3.5
软件大小:62.5M
更新时间:9-25

按键精灵iOS版
立即下载

软件版本:1.3.5
软件大小:29.2M
更新时间:06-14

最新企业版UiBot
立即下载

软件版本:3.3
软件大小:282M
更新时间:08-06

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
发新话题 回复该主题

[已解决] 困扰已久的多线程脚本中的参数传递问题 [复制链接]

1#
困扰已久的多线程脚本中的参数传递问题
我已知的: 单线程脚本中, dim定义的变量是定义之后可在sub和function中自由调用, 自由修改
多线程脚本中:
1. 主线程内dim的变量, 无法直接在子线程中调用和修改, 也无法使用函数参数的方式传递进子线程, 现在我的做法是用global变量或者读写ini的方式传递进子线程使用, 这个理解....
2. 子线程中的变量, 一样也无法在主线程中读写, 也是用ini读写的方式传回主线程, OK
我不确定的问题:
1. 子线程中Dim的变量, 当线程调用sub或function时, 是否可以直接在sub/function中读写??
我在相当长时间一直想当然的以为是可以的! 也是在用这个原则在写脚本, 然后当多线程脚本有各种莫名其妙的问题后, 我做了如下测试:

//主线程
threadID=beginthread(子线程)

function 子线程()
dim 子线程参数
子线程参数=1
call 子程序() //这个调用改动无效
traceprint(子线程参数) //返回还是1
end function

sub 子程序()
traceprint(子线程参数) //返回为空, 因为并无定义, 也无法调用线程中参数
子线程参数=2 //这里实际相当于新dim了一个, 跟线程中参数无关
end sub

这结果直接否定了我好多代码......尴尬死了, 那问题来了, 正确的做法应该是什么? 只能用函数参数的方式传递进sub/function么? 是的话那下一个问题就更尴尬了

2. 比如我写的一个子程序是游戏中全屏识别各种数字和信息, 为了调用方便打包成sub
sub 全屏识别 //屏幕中几十个相关信息的识别
姓名=XXX
XX等级=XXX
XX等级=XXX
.....
end sub
识别出的信息, 在调用他的子线程中使用, 还有做文件记录
类似的sub和function有不少, 在单线程脚本当然没任何问题, 但是多线程脚本中, 在子线程中调用就各种出错, 其实按上面的测试来说应该完全无效, 因为里面根本不是调用修改子线程中的变量, 而是相当于新dim了一个, 也不能传递回线程, 奇怪的是, 这个子程序是部分有效的!! 可以识别记录好多信息, 只是总出错, 不能像单线程下一样完美运行

一个问题是, 为啥部分有效? 啥情况下有效, 啥情况下无效?
最重要的问题是, 如果想完美运行, 那该咋办? 把所有类似sub/function, 都完整的写到线程的调用处么? 这样做是要疯掉了

学习到这里, 我已经一头雾水, 无法自行解决了, 希望工程师可以帮我权威性解解惑......多谢多谢....

本主题由 超级版主 n15976906190 于 2020/1/16 8:39:58 执行 审核帖子 操作
2#

回复 1楼snowfox1979的帖子
  1. 1、全局变量(在主程序中声明,作用域为当前脚本的主、子程序、函数,但不包含多线程)Global
  2. 2、局部变量(在子程序、函数中声明,作用域为当前过程)Dim
  3. 3、环境变量(在主程序中声明,作用域为多个脚本的界面过程,主、子程序、函数,及多线程)DimEnv
复制代码
总结:
1.需要多线程/界面等中传递使用<环境变量> 其他直接不定义
2.需要Sub和Function独有 就在其内Dim 其他直接不定义

收徒索引 ←点击

个 人 Q Q : 1 2 2 3 1 1 6 6 1 8
3#

回复 2楼n15976906190的帖子

可以更具体一点么, 我的想法是在每一个线程中使用一套变量, 作用在整个线程以及该线程调用的所有sub/function中, 而不是在sub和function中用一次就失效了, 类似这样:
//主线程
.....
ID1 = begainthread(子线程)
ID2 = begainthread(子线程)
ID3 = begainthread(子线程)
....

sub 子线程()
//定义参数1, 参数2, 参数3....参数N
call 子程序1()
call 子程序2()
call 子程序3() //每个子程序都可能是好多次call
end sub

sub 子程序1()
//使用/修改参数1, 2, 3, N
end sub

function 子程序2()
//使用/修改参数1, 2, 3, N
end function
......

要保证在同一个线程下, 参数1-N是统一的, 那这些参数应该如何定义, 如何传递呢, 如果是用ini读写传递是可以做到的, 但非常烦琐, 因为参数非常非常多

4#

回复 3楼snowfox1979的帖子

注:你好 无需定义 多线程间相同变量不会冲突 子程序的变量可以给调用的子程序1-N使用

收徒索引 ←点击

个 人 Q Q : 1 2 2 3 1 1 6 6 1 8
5#

回复 4楼n15976906190的帖子

刚开始没明白你说的无需定义是啥用意......原以为是说不管Dim还是没Dim都行, 但是实地测试了一下, 真的是Dim后就无法在调用的sub中访问, 没Dim就可以访问, 所以我理解没错的话, 在线程中Dim变量就代表作用域是当前线程, 不包括线程中调用的sub/func, 如果没Dim, 直接在线程中使用, 则作用域为整个线程+所有调用的sub/func, 包括嵌套调用的sub/func, 附上测试代码......
问题完美解决!! 再次多谢工程师解惑!!

Global threadID
//主线程
For i=1 to 3
threadID = BeginThread(子线程)
Delay 100
next
Function 子线程()
// Dim 参数0
// Dim 参数1
// Dim 参数2
// Dim 参数3
// Dim ID
ID = threadID
traceprint("------------"&ID&"线程start----------------")
参数0 = 1
参数1 = 0
参数2 = 0
参数3 = 0
Delay 100
Call 子程序(ID)
Delay 100
//显示数据为线程ID, 及加减乘除过后的数值, 即为正常访问
TracePrint (ID & ",线程中" & 参数0 & "," & 参数1 & "," & 参数2 & "," & 参数3)
end function

sub 子程序(aa)
TracePrint (ID&"子程序获取参数="&参数0&","&参数1&","&参数2&","&参数3)
参数0 = aa + 1
参数1 = aa - 1
参数2 = aa * 2
参数3 = int(aa / 2)
call 子程序1() //各线程循环显示结果, 测试参数在各线程间是否独立, 以及嵌套调用sub/func是否同样有效
end sub

Sub 子程序1()
For 3
TracePrint (ID & "," & "子程序1调用参数=" & 参数0 & "," & 参数1 & "," & 参数2 & "," & 参数3)
Delay 1000
Next
Call 子程序2()
End Sub

function 子程序2()
For 2
TracePrint (ID & "," & "子程序2调用参数=" & 参数0 & "," & 参数1 & "," & 参数2 & "," & 参数3)
Delay 1000
next
End Function

发新话题 回复该主题