版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 垂体危象与垂体卒中讲课课件
- 21、《槐乡五月》第二课时
- 初二年级期中考试家长会教学案例
- 二零二五年网络零售商合作协议样本2篇
- 新教材高考地理一轮复习课时作业二十四城镇化课件新人教版
- 水利工程合同管理制度
- 黄金投资入门教学教案
- 九年级物理全册192家庭电路中电流过大的原因课件新版新人教版
- 《科幻小说赏析与写作》 课件 -第四章 “生命奇迹”的重述与复魅-《弗兰肯斯坦》
- 二零二五年矿产品资源整合开发合作协议书3篇
- 华为基于价值链循环的绩效管理体系建设
- 植物工厂简介演示
- 幼儿园大班数学上学期期中考试练习题带解析
- 竣工验收阶段服务配合保障措施
- 集控中心方案
- 2024年湖南会展集团招聘笔试参考题库含答案解析
- 2024年山东省春季高考技能考试汽车专业试题库-中(多选题汇总)
- 2024年《大学语文》期末考试复习题库(含答案)
- 跨部门沟通与协调课件
- 2022年版《义务教育信息科技技术新课程标准》试题与答案
- 物流公司出纳年终工作总结
评论
0/150
提交评论