按键精灵教程解决多线程资源冲突_第1页
按键精灵教程解决多线程资源冲突_第2页
按键精灵教程解决多线程资源冲突_第3页
按键精灵教程解决多线程资源冲突_第4页
按键精灵教程解决多线程资源冲突_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——按键精灵教程解决多线程资源冲突按键精灵教程:解决多线程资源冲突

来源:按键学院

故事就从一位童鞋的凄凉经历说起吧。那是一个雷雨交加的夜晚

这位童鞋熬夜写了一个关于《赤月传闻》交易功能的多线程多开脚本。狂喜之余立马投身测试

测试的结果却让他的脸变成了屎色

他开了15个窗口,挂了半小时,就有10个窗口崩溃了。

他首先想到的是,会不会是电脑不给力,线程开多了导致的崩溃?于是,他只开了5个窗口

啊~5个窗口崩了3个这个问题困扰了他一个月,后来才发现!

原来,游戏里规定,交易只能是一对一的他没有在脚本中做处理

于是,启动脚本之后,所有的号都争着和交易号进行交易,

只有一个窗口抢到了和交易号交易的机遇,其它的窗口没有抢到,就不断循环判断导致窗口崩溃

就像10个人争抢一个茅坑一样,1个人抢到了,其余9个人都掉坑里了……

怎么才能让他们好好排队上厕所呢?好多童鞋可能会立马想到互斥体。

将交易的那段代码用互斥体保护起来,当一个线程在执行交易代码时,其它的线程就无法进行交易操作。

为了便利大家学习和使用,我们的06老湿提供了一段Api创立互斥体的代码范例~

API函数

要用到三个Api函数:CreateMutexWaitForSingleObjectReleaseMutex

步骤

1、调用Api函数:CreateMutex函数创立一个新的互斥体,并且将创立之后返回的互斥体句柄赋值给环境变量:交易

2、交易代码执行之前,调用Api函数:WaitForSingleObject函数,设置互斥体使用时长为30秒。(假使一个交易操作需要3分钟,则这里的使用时长设置为大于等于30分钟。)当第一条线程执行到WaitForSingleObject函数时,会获取30秒的互斥体使用时长,在这30秒时间内,只有第一条线程可以执行被互斥体保护起来的代码段,其它的线程都在等待。

3、交易代码执行之后,调用Api函数:ReleaseMutex函数,释放互斥体使用权当30秒时间过后,第一条线程会释放对互斥体的控制权,让给下一条线程使用。

代码

DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong

DeclareFunctionReleaseMutexLib\

DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong

'DeclareFunctionCloseHandlelib\

Dimenv交易交易=创立互斥体()For10

BeginThread游戏交易Next

Sub游戏交易()//绑定窗口//登录帐号//寻觅npc

Call锁定(交易,30000)//交易

Call解锁(交易)EndSub

Function创立互斥体()'/*随机生成互斥体名称DimTempStr,i

TempStr=\Fori=0To12Randomize

TempStr=TempStr&Chr((24*Rnd)+65)Next'*/

创立互斥体=CreateMutex(0,true,TempStr)EndFunction

Sub关闭互斥体(hdr)CallCloseHandle(hdr)EndSub

Function锁定(Hdr,Max)

锁定=WaitForSingleObject(Hdr,Max)EndFunction

Function解锁(Hdr)

CallReleaseMutex(Hdr)EndFunction/*

SubOnScriptExit()TracePrint\关闭互斥体\Call关闭互斥体(交易)EndSub'*/

注意1:

本例子中,在创立互斥体时,使用了随机产生互斥体的名称随机名称是以“anjian_mutex_〞开头并且加上12个随机字母

随机名称这样繁杂是为了避免名称冲突,假使有一样的名称存在,那么当前的互斥体就会创立失败注意2:

代码中还有一个CloseHandle函数,被解释掉了

由于,我们的主线程终止得比其它的十条线程快,所以当十条线程还在创立启动的过程中,主线程就已经终止,并且触发了脚本中止事件,执行了关闭互斥体的命令这样会导致,刚创立的互斥体被关闭的状况

所以,假使主线程终止得比其他线程快,就不要使用关闭互斥体命令了互斥体所占用的内存空间并不大,不关闭也不影响

那么,假使游戏规定,登录帐号和交易这两个操作都只能一个一个进行操作呢?那么我们就需要设置两个互斥体:登录互斥体和交易互斥体代码:

DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong

DeclareFunctionReleaseMutexLib\

DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong

'DeclareFunctionCloseHandlelib\

Dimenv交易,登录登录=创立互斥体()交易=创立互斥体()For10

BeginThread游戏交易Next

Sub游戏交易()

//绑定窗口

Call锁定(登录,30000)//登录帐号Call解锁(登录)

//寻觅npc

Call锁定(交易,30000)//交易

Call解锁(交易)EndSub

Function创立互斥体()'/*随机生成互斥体名称DimTempStr,i

TempStr=\Fori=0To12Randomize

TempStr=TempStr&Chr((24*Rnd)+65)Next'*/

创立互斥体=CreateMutex(0,true,TempStr)EndFunction

Sub关闭互斥体(hdr)CallCloseHandle(hdr)EndSub

Function锁定(Hdr,Max)

锁定=WaitForSingleObject(Hdr,Max)EndFunction

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论