按键精灵 多线程用法多线程

你的位置:
多线程功能介绍
&&& 目前按键精灵的脚本执行方式都是单线程的,单线程就好比公路上的单行道,脚本只能一条一条的顺序执行。而多线程,就是提供了多车道,多个脚本可以并行执行。& 按键精灵提供的多线程功能有5个要用到的命令,下面我们一一介绍:& [DimEnv]& 解释:定义环境变量。& 备注:用于多线程之间传递变量值功能,仍在试验阶段,不推荐新手使用。
& [BeginThread]& 格式:{返回线程ID} = BeginThread(过程名)& 解释:启动某个线程。& 备注:用于多线程功能,仍在试验阶段,不推荐新手使用。
& [StopThread]& 格式:StopThread {线程ID}& 解释:停止某个线程。& 备注:用于多线程功能,仍在试验阶段,不推荐新手使用。
& [PauseThread]& 格式:PauseThread {线程ID}& 解释:暂停某个线程。& 备注:用于多线程功能,仍在试验阶段,不推荐新手使用。
& [ContinueThread]& 格式:ContinueThread {线程ID}& 解释:继续某个线程。& 备注:用于多线程功能,仍在试验阶段,不推荐新手使用。
& 脚本例子:& MessageBox "多线程命令还在测试当中,并不稳定,请谨慎使用"& //下面这个例子会打开一个记事本,用4个线程向其中模拟按键& Call RunApp("notepad")& Delay 1000& BeginThread Thread1& BeginThread Thread2& BeginThread Thread3& BeginThread Thread4& //下面是主线程缓冲,必须加这个无限循环& While 1&& && Delay 1000& Wend & EndScript & Sub Thread1& &&& While 1& &&&&&&& Delay 500& &&&&&&& KeyPress 49,1&& && Wend& & End Sub & Sub Thread2& &&& While 1& &&&&&&& Delay 550& &&&&&&& KeyPress 50,1& &&& Wend & End Sub & Sub Thread3& &&& While 1& &&&&&&& For 2& &&&&&&&&&&& Delay 1000& &&&&&&& Next & &&&&&&& KeyPress 51,1& &&& Wend & End Sub & Sub Thread4& &&& While 1& &&&&&&& For 5&& &&&&&&&&&& Delay 1000&&& &&&&& Next &&&& &&&& KeyPress 52,1&&&& &Wend & End Sub按键精灵教程:解决多线程资源冲突_百度经验
&&&&&&电脑按键精灵教程:解决多线程资源冲突听语音
百度经验:jingyan.baidu.com按键精灵教程:解决多线程资源冲突百度经验:jingyan.baidu.com按键精灵2014百度经验:jingyan.baidu.com1故事就从一位童鞋的悲惨经历说起吧。那是一个雷雨交加的夜晚这位童鞋熬夜写了一个关于《赤月传说》交易功能的多线程多开脚本。狂喜之余立马投身测试测试的结果却让他的脸变成了屎色他开了15个窗口,挂了半小时,就有10个窗口崩溃了。2他首先想到的是,会不会是电脑不给力,线程开多了导致的崩溃?于是,他只开了5个窗口啊~5个窗口崩了3个这个问题困扰了他一个月,后来才发现!原来,游戏里规定,交易只能是一对一的他没有在脚本中做处理于是,启动脚本之后,所有的号都争着和交易号进行交易,只有一个窗口抢到了和交易号交易的机会,其它的窗口没有抢到,就不断循环判断导致窗口崩溃就像10个人争抢一个茅坑一样,1个人抢到了,其余9个人都掉坑里了……3怎么才能让他们好好排队上厕所呢?很多童鞋可能会立马想到互斥体。将交易的那段代码用互斥体保护起来,当一个线程在执行交易代码时,其它的线程就无法进行交易操作。为了方便大家学习和使用,我们的06老湿提供了一段Api创建互斥体的代码范例~&4API函数要用到三个Api函数:CreateMutexWaitForSingleObjectReleaseMutex5步骤调用Api函数:CreateMutex函数创建一个新的互斥体,并且将创建之后返回的互斥体句柄赋值给环境变量:交易2、交易代码执行之前,调用Api函数:WaitForSingleObject函数,&设置互斥体使用时长为30秒。(如果一个交易操作需要3分钟,则这里的使用时长设置为大于等于30分钟。)&&&当第一条线程执行到&WaitForSingleObject函数时,会获取30秒的互斥体使用时长,在这30秒时间内,只有第一条&&&&&&&&&&线程可以执行被互斥体保护起来的代码段,其它的线程都在等待。1、3、交易代码执行之后,调用Api函数:ReleaseMutex函数,&释放互斥体使用权&&&当30秒时间过后,第一条线程会释放对互斥体的控制权,让给下一条线程使用。&6代码Declare&Function&CreateMutex&Lib&&kernel32&&Alias&&CreateMutexA&&(lpMutexAttributes&As&Long&,&ByVal&bInitialOwner&As&Long,&ByVal&lpName&As&String)&As&LongDeclare&Function&ReleaseMutex&Lib&&kernel32&&Alias&&ReleaseMutex&&(ByVal&hMutex&As&Long)Declare&Function&WaitForSingleObject&Lib&&kernel32&&Alias&&WaitForSingleObject&&(ByVal&hHandle&As&Long,&ByVal&dwMilliseconds&As&Long)&As&Long'Declare&Function&CloseHandle&lib&&kernel32&&(hdr&as&long)&as&Long&Dimenv&交易交易&=&创建互斥体()&For&10&&&&BeginThread&&游戏交易Next&Sub&游戏交易()&&&&//绑定窗口&&&&//登录帐号&&&&//寻找npc&&&&Call&锁定(交易,&30000)&&&&//交易&&&&Call&解锁(交易)End&Sub&Function&创建互斥体()&&&&'/*随机生成互斥体名称&&&&Dim&TempStr,&i&&&&TempStr&=&&anjian_mutex_&&&&&For&i&=&0&To&12&&&&&&&&Randomize&&&&&&&&TempStr&=&TempStr&&&Chr((24&*&Rnd)&+&65)&&&&Next&&&&'*/&&&&&&&&创建互斥体&=&CreateMutex(0,&true,&TempStr)End&Function&Sub&关闭互斥体(hdr)&&&&Call&CloseHandle(hdr)End&Sub&Function&锁定(Hdr,&Max)&&&&锁定&=&WaitForSingleObject(Hdr,&Max)End&Function&Function&解锁(Hdr)&&&&Call&ReleaseMutex(Hdr)End&Function&/*Sub&OnScriptExit()&&&TracePrint&&关闭互斥体&&&&Call&关闭互斥体(交易)End&Sub'*/ &7注意1:本例子中,在创建互斥体时,使用了随机产生互斥体的名称随机名称是以&“anjian_mutex_”开头并且加上12个随机字母随机名称这样复杂是为了避免名称冲突,如果有一样的名称存在,那么当前的互斥体就会创建失败8注意2:代码中还有一个CloseHandle函数,被注释掉了因为,我们的主线程结束得比其它的十条线程快,所以当十条线程还在创建启动的过程中,主线程就已经结束,并且触发了脚本停止事件,执行了关闭互斥体的命令这样会导致,刚创建的互斥体被关闭的情况所以,如果主线程结束得比其他线程快,就不要使用关闭互斥体命令了互斥体所占用的内存空间并不大,不关闭也不影响9那么,如果游戏规定,&登录帐号和交易&这两个操作都只能一个一个进行操作呢?那么我们就需要设置两个互斥体:登录互斥体&和&交易互斥体&&代码:Declare&Function&CreateMutex&Lib&&kernel32&&Alias&&CreateMutexA&&(lpMutexAttributes&As&Long&,&ByVal&bInitialOwner&As&Long,&ByVal&lpName&As&String)&As&LongDeclare&Function&ReleaseMutex&Lib&&kernel32&&Alias&&ReleaseMutex&&(ByVal&hMutex&As&Long)Declare&Function&WaitForSingleObject&Lib&&kernel32&&Alias&&WaitForSingleObject&&(ByVal&hHandle&As&Long,&ByVal&dwMilliseconds&As&Long)&As&Long'Declare&Function&CloseHandle&lib&&kernel32&&(hdr&as&long)&as&Long&Dimenv&交易,登录登录&=&创建互斥体()交易&=&创建互斥体()&For&10&&&&BeginThread&&游戏交易Next&Sub&游戏交易()&&&&&//绑定窗口&&&&&&&&&&&Call&锁定(登录,&30000)&&&&//登录帐号&&&&Call&解锁(登录)&&&&&&&&//寻找npc&&&&&&&&&Call&锁定(交易,&30000)&&&&//交易&&&&Call&解锁(交易)End&Sub&Function&创建互斥体()&&&&'/*随机生成互斥体名称&&&&Dim&TempStr,&i&&&&TempStr&=&&anjian_mutex_&&&&&For&i&=&0&To&12&&&&&&&&Randomize&&&&&&&&TempStr&=&TempStr&&&Chr((24&*&Rnd)&+&65)&&&&Next&&&&'*/&&&&&&&&创建互斥体&=&CreateMutex(0,&true,&TempStr)End&Function&Sub&关闭互斥体(hdr)&&&&Call&CloseHandle(hdr)End&Sub&Function&锁定(Hdr,&Max)&&&&锁定&=&WaitForSingleObject(Hdr,&Max)End&Function&Function&解锁(Hdr)&&&&Call&ReleaseMutex(Hdr)End&Function&/*Sub&OnScriptExit()&&&TracePrint&&关闭互斥体&&span&style=&font-size:&14.4&&Call&关闭互斥体(登录)&/span&&&&Call&关闭互斥体(交易)End&Sub'*/&&END经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。投票(1)已投票(1)有得(0)我有疑问(0)◆◆说说为什么给这篇经验投票吧!我为什么投票...你还可以输入500字◆◆只有签约作者及以上等级才可发有得&你还可以输入1000字◆◆如对这篇经验有疑问,可反馈给作者,经验作者会尽力为您解决!你还可以输入500字相关经验070401热门杂志第1期你不知道的iPad技巧3720次分享第1期win7电脑那些事6548次分享第2期新人玩转百度经验1372次分享第1期Win8.1实用小技巧2629次分享第1期小白装大神1872次分享◆请扫描分享到朋友圈你的位置:
学习多线程的体会总结,探讨线程传参数问题
17:22:57 |
来源: 按键精灵资源站
声明:以下代码的运行环境为9.51.11790版,若为其他版本可能运行结果与本文不一致。多线程涉及的命令有BeginThreadDimEnvStopThreadPauseThreadContinueThread 使用多线程的时候,都必须先定义一个过程,在启动线程的时候,让线程执行该过程。示例代码如下:threadId = BeginThread(testThread)TracePrint &线程ID为& & threadIdSub testThread()& & TracePrint&启动了线程&End Sub上面的代码是一个最简单启动线程代码,BeginThread函数返回线程ID。程序输出如下: StopThread(线程ID)& &//停止线程PauseThread(线程ID)&&//暂停线程ContinueThread(线程ID)& &//继续运行线程。使用ContinueThread的前提是此线程必须未停止,且已使用PauseThread暂停 子线程内部是无法访问主线程的全局变量的,但可以访问和修改主线程中使用DimEnv命令定义的环境变量。看如下代码:globalVar = &globalVar&DimEnv globalEnvglobalEnv = &globalEnv&threadId = BeginThread(testThread)TracePrint &主线程ID为& & threadIdTracePrint &主线程暂停0.3秒&Delay 300TracePrint &主线程输出全局变量& & globalVarTracePrint &主线程输出环境变量&&&& globalEnv Sub testThread()TracePrint&子线程里输出全局变量& & globalVarTracePrint&子线程里输出环境变量& & globalEnvglobalVar= &我郁你个闷& //这行语句实际上定义了testThread过程的局部变量globalEnv= &我顶你个肺&End Sub 以上代码定义了一个过程testThread,一个全局变量globalVar以及环境变量globalEnv。启动线程后马上把主线程暂停0.3秒(为保证CPU有足够的时间片切换至线程testThread并执行完毕),在线程testThread内输出globalVar和globalEnv的值,随后修改他们的值。主线程继续执行并输出globalVar和globalEnv的值。调试窗口输出如下:
& &//可见环境变量值被子线程修改了 从上面的内容可看出线程内部无法访问和修改全局变量,但可以访问和修改环境变量。并且子线程内部不允许定义环境变量。 网上有很多文章都持这样的观点:“Q的多线程无法像函数,普通过程调用一样传参,要实现参数传递的效果就必须使用环境变量“。也许这些文章是很久以前发表的,早期版本的按键可能确实是这样的,但我对这个观点不苟同。到底启用线程时能否像普通过程调用一样传参呢,让事实说话吧。请看下面的程序://声明:以下代码的运行环境为9.51.11790版,若为其他版本可能运行结果与本文不一致。const& &arg2 = &参数2&& && &//arg2为常量arg3 = &你看,传过去了& //arg3为变量threadId =BeginThread(&&testThread(&&&参数1&,&&arg2 ,&&arg3&&)
)&&//启动线程时,给线程入口程序传入三实参Sub testThread(&&arg1 , arg2 ,arg3&&)& && & //给过程定义三形参& & TracePrint &线程里输出arg1:& & arg1& & TracePrint &线程里输出arg2:& & arg2& & TracePrint &线程里输出arg3:& & arg3End Sub程序输出如下:脚本多线程.Q ,第83行:线程里输出arg2: 可以看出,启动线程不是不可以传参数,假如实参为立即数(汇编术语)则能被传到线程,而常量变量标识符所对应的数值却不能传到线程。以上的结论虽没什么实用意义,大多数实参都是经过计算得出并保存在变量中的,以立即数作为实参的情况相对来说非常少,故多数人持前文中提到的观点并不奇怪。我只是由于JAVA和C语言的经验作祟,故意用程序验证一下,于是得出上面拨一点儿乱反一点儿正之说,权当谈资。 总结一下本文的知识点:1. BeginThread实际上是新开线程,并为该线程指定代码入口地址,而线程所执行的代码段是由一个Sub来定义的。2. 子线程内部是无法访问主线程的全局变量的,但可以访问和修改主线程中使用DimEnv命令定义的环境变量。由于线程跑的是SUB,SUB没有返回值,故可用环境变量充当返回值。3. 定义环境变量时不能同时给他赋值,定义环境变量和为环境变量赋值必须分两行写,否则会有语法错误提示。4. 子线程内部不允许定义环境变量。5. 启动线程不是不可以传参数,假如实参为立即数(汇编术语)则能被传到线程,而常量变量标识符所对应的数值却不能传到线程作者的其他最新日志
评论 ( 个评论)你的位置:
多线程找图问题
11:07:31 |
来源: 按键精灵资源站
Sub 复活()
& & set dm = createobject(&dm.dmsoft&)
& & dm.SetPath &.\plugin\大漠梦想&
& & While 7=7
& & Rem 人物死亡
& & dm_ret = dm.CmpColor(225,689,&0a0b0b&,0.8)
& & If dm_ret = 0 Then
& && &&&Delay 100
& && &&&MessageBox &死亡&
& && &&&Delay 1000
& && &&&Goto 人物死亡
& & End If
循环判断人物是否死亡
& & Delay 5000
& & Rem 人物复活
& && &&&dm_ret = dm.CmpColor(229,696,&f7ebcb&,0.8)
& && &&&If dm_ret = 0 Then
& && &&&Else
& && &&&Delay 1000
& & Goto 人物复活
& && && && &End If
循环判断人物是否复活
& & Delay 1000
dm.MoveTo 115,688
dm.RightClick
dm_ret = dm.CmpColor(105,649,&eeeeee&,0.9)
If dm_ret = 0 Then
& & Goto 新岛
移动到打怪处
dm_ret = dm.FindPic(0,0,,&BOSS.bmp&,&.9,0,intX,intY)
If intX &= 0 and intY &= 0 Then
(找怪)找图的命令& & PS:就是这里出问题了 他老是不找
& & Delay 1000
& & dm.MoveTo x+2,y+2
& & Delay 500
& & dm.RightClick
& & Delay 5000
& & Call Plugin.Bkgnd.LeftClick(Hwnd, 229, 699)
& & Delay 1000
& && &&&MessageBox &没有找到 &
上面是我的代码各位大大帮忙看下是那里出问题了!
这个是多线程的判断人物是否死亡 如果死亡 回到打怪点继续打怪!
可是到打怪点以后他不找怪的图片了!}

我要回帖

更多关于 按键精灵安卓多线程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信