![按鍵精靈教程解決多線程資源沖突_第1頁(yè)](http://file4.renrendoc.com/view/2839cec0086b161b528007c13ae3cf53/2839cec0086b161b528007c13ae3cf531.gif)
![按鍵精靈教程解決多線程資源沖突_第2頁(yè)](http://file4.renrendoc.com/view/2839cec0086b161b528007c13ae3cf53/2839cec0086b161b528007c13ae3cf532.gif)
![按鍵精靈教程解決多線程資源沖突_第3頁(yè)](http://file4.renrendoc.com/view/2839cec0086b161b528007c13ae3cf53/2839cec0086b161b528007c13ae3cf533.gif)
![按鍵精靈教程解決多線程資源沖突_第4頁(yè)](http://file4.renrendoc.com/view/2839cec0086b161b528007c13ae3cf53/2839cec0086b161b528007c13ae3cf534.gif)
![按鍵精靈教程解決多線程資源沖突_第5頁(yè)](http://file4.renrendoc.com/view/2839cec0086b161b528007c13ae3cf53/2839cec0086b161b528007c13ae3cf535.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——按鍵精靈教程解決多線程資源沖突按鍵精靈教程:解決多線程資源沖突
來(lái)源:按鍵學(xué)院
故事就從一位童鞋的凄涼經(jīng)歷說(shuō)起吧。那是一個(gè)雷雨交加的夜晚
這位童鞋熬夜寫了一個(gè)關(guān)于《赤月傳聞》交易功能的多線程多開(kāi)腳本??裣仓嗔ⅠR投身測(cè)試
測(cè)試的結(jié)果卻讓他的臉變成了屎色
他開(kāi)了15個(gè)窗口,掛了半小時(shí),就有10個(gè)窗口崩潰了。
他首先想到的是,會(huì)不會(huì)是電腦不給力,線程開(kāi)多了導(dǎo)致的崩潰?于是,他只開(kāi)了5個(gè)窗口
啊~5個(gè)窗口崩了3個(gè)這個(gè)問(wèn)題困擾了他一個(gè)月,后來(lái)才發(fā)現(xiàn)!
原來(lái),游戲里規(guī)定,交易只能是一對(duì)一的他沒(méi)有在腳本中做處理
于是,啟動(dòng)腳本之后,所有的號(hào)都爭(zhēng)著和交易號(hào)進(jìn)行交易,
只有一個(gè)窗口搶到了和交易號(hào)交易的機(jī)遇,其它的窗口沒(méi)有搶到,就不斷循環(huán)判斷導(dǎo)致窗口崩潰
就像10個(gè)人爭(zhēng)搶一個(gè)茅坑一樣,1個(gè)人搶到了,其余9個(gè)人都掉坑里了……
怎么才能讓他們好好排隊(duì)上廁所呢?好多童鞋可能會(huì)立馬想到互斥體。
將交易的那段代碼用互斥體保護(hù)起來(lái),當(dāng)一個(gè)線程在執(zhí)行交易代碼時(shí),其它的線程就無(wú)法進(jìn)行交易操作。
為了便利大家學(xué)習(xí)和使用,我們的06老濕提供了一段Api創(chuàng)立互斥體的代碼范例~
API函數(shù)
要用到三個(gè)Api函數(shù):CreateMutexWaitForSingleObjectReleaseMutex
步驟
1、調(diào)用Api函數(shù):CreateMutex函數(shù)創(chuàng)立一個(gè)新的互斥體,并且將創(chuàng)立之后返回的互斥體句柄賦值給環(huán)境變量:交易
2、交易代碼執(zhí)行之前,調(diào)用Api函數(shù):WaitForSingleObject函數(shù),設(shè)置互斥體使用時(shí)長(zhǎng)為30秒。(假使一個(gè)交易操作需要3分鐘,則這里的使用時(shí)長(zhǎng)設(shè)置為大于等于30分鐘。)當(dāng)?shù)谝粭l線程執(zhí)行到WaitForSingleObject函數(shù)時(shí),會(huì)獲取30秒的互斥體使用時(shí)長(zhǎng),在這30秒時(shí)間內(nèi),只有第一條線程可以執(zhí)行被互斥體保護(hù)起來(lái)的代碼段,其它的線程都在等待。
3、交易代碼執(zhí)行之后,調(diào)用Api函數(shù):ReleaseMutex函數(shù),釋放互斥體使用權(quán)當(dāng)30秒時(shí)間過(guò)后,第一條線程會(huì)釋放對(duì)互斥體的控制權(quán),讓給下一條線程使用。
代碼
DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong
DeclareFunctionReleaseMutexLib\
DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong
'DeclareFunctionCloseHandlelib\
Dimenv交易交易=創(chuàng)立互斥體()For10
BeginThread游戲交易Next
Sub游戲交易()//綁定窗口//登錄帳號(hào)//尋覓npc
Call鎖定(交易,30000)//交易
Call解鎖(交易)EndSub
Function創(chuàng)立互斥體()'/*隨機(jī)生成互斥體名稱DimTempStr,i
TempStr=\Fori=0To12Randomize
TempStr=TempStr&Chr((24*Rnd)+65)Next'*/
創(chuàng)立互斥體=CreateMutex(0,true,TempStr)EndFunction
Sub關(guān)閉互斥體(hdr)CallCloseHandle(hdr)EndSub
Function鎖定(Hdr,Max)
鎖定=WaitForSingleObject(Hdr,Max)EndFunction
Function解鎖(Hdr)
CallReleaseMutex(Hdr)EndFunction/*
SubOnScriptExit()TracePrint\關(guān)閉互斥體\Call關(guān)閉互斥體(交易)EndSub'*/
注意1:
本例子中,在創(chuàng)立互斥體時(shí),使用了隨機(jī)產(chǎn)生互斥體的名稱隨機(jī)名稱是以“anjian_mutex_〞開(kāi)頭并且加上12個(gè)隨機(jī)字母
隨機(jī)名稱這樣繁雜是為了避免名稱沖突,假使有一樣的名稱存在,那么當(dāng)前的互斥體就會(huì)創(chuàng)立失敗注意2:
代碼中還有一個(gè)CloseHandle函數(shù),被解釋掉了
由于,我們的主線程終止得比其它的十條線程快,所以當(dāng)十條線程還在創(chuàng)立啟動(dòng)的過(guò)程中,主線程就已經(jīng)終止,并且觸發(fā)了腳本中止事件,執(zhí)行了關(guān)閉互斥體的命令這樣會(huì)導(dǎo)致,剛創(chuàng)立的互斥體被關(guān)閉的狀況
所以,假使主線程終止得比其他線程快,就不要使用關(guān)閉互斥體命令了互斥體所占用的內(nèi)存空間并不大,不關(guān)閉也不影響
那么,假使游戲規(guī)定,登錄帳號(hào)和交易這兩個(gè)操作都只能一個(gè)一個(gè)進(jìn)行操作呢?那么我們就需要設(shè)置兩個(gè)互斥體:登錄互斥體和交易互斥體代碼:
DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong
DeclareFunctionReleaseMutexLib\
DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong
'DeclareFunctionCloseHandlelib\
Dimenv交易,登錄登錄=創(chuàng)立互斥體()交易=創(chuàng)立互斥體()For10
BeginThread游戲交易Next
Sub游戲交易()
//綁定窗口
Call鎖定(登錄,30000)//登錄帳號(hào)Call解鎖(登錄)
//尋覓npc
Call鎖定(交易,30000)//交易
Call解鎖(交易)EndSub
Function創(chuàng)立互斥體()'/*隨機(jī)生成互斥體名稱DimTempStr,i
TempStr=\Fori=0To12Randomize
TempStr=TempStr&Chr((24*Rnd)+65)Next'*/
創(chuàng)立互斥體=CreateMutex(0,true,TempStr)EndFunction
Sub關(guān)閉互斥體(hdr)CallCloseHandle(hdr)EndSub
Function鎖定(Hdr,Max)
鎖定=WaitForSingleObject(Hdr,Max)EndFunction
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年石棉摩擦制品項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)電動(dòng)玩具飛機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年橡膠發(fā)泡墊項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)手搖交直流發(fā)電機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年履帶式自動(dòng)數(shù)粒包裝線項(xiàng)目可行性研究報(bào)告
- 2025年交變負(fù)荷試驗(yàn)機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年202含氫硅油項(xiàng)目可行性研究報(bào)告
- 2025至2030年金屬沙發(fā)項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年蓄熱瓷管項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2030年電動(dòng)日期編碼機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 贏在團(tuán)隊(duì)執(zhí)行力課件
- 慢性胰腺炎課件
- 北京理工大學(xué)應(yīng)用光學(xué)課件第四章
- 陰道鏡幻燈課件
- 2022年山東司法警官職業(yè)學(xué)院?jiǎn)握姓Z(yǔ)文試題及答案解析
- PCB行業(yè)安全生產(chǎn)常見(jiàn)隱患及防范措施課件
- DB32∕T 186-2015 建筑消防設(shè)施檢測(cè)技術(shù)規(guī)程
- 2022年福建泉州中考英語(yǔ)真題【含答案】
- 汽車座椅骨架的焊接夾具畢業(yè)設(shè)計(jì)說(shuō)明書(共23頁(yè))
- 露天礦山職業(yè)危害預(yù)先危險(xiǎn)分析表
- 淺談固定資產(chǎn)的審計(jì)
評(píng)論
0/150
提交評(píng)論