按鍵精靈教程解決多線程資源沖突_第1頁
按鍵精靈教程解決多線程資源沖突_第2頁
按鍵精靈教程解決多線程資源沖突_第3頁
按鍵精靈教程解決多線程資源沖突_第4頁
按鍵精靈教程解決多線程資源沖突_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——按鍵精靈教程解決多線程資源沖突按鍵精靈教程:解決多線程資源沖突

來源:按鍵學(xué)院

故事就從一位童鞋的凄涼經(jīng)歷說起吧。那是一個(gè)雷雨交加的夜晚

這位童鞋熬夜寫了一個(gè)關(guān)于《赤月傳聞》交易功能的多線程多開腳本。狂喜之余立馬投身測(cè)試

測(cè)試的結(jié)果卻讓他的臉變成了屎色

他開了15個(gè)窗口,掛了半小時(shí),就有10個(gè)窗口崩潰了。

他首先想到的是,會(huì)不會(huì)是電腦不給力,線程開多了導(dǎo)致的崩潰?于是,他只開了5個(gè)窗口

啊~5個(gè)窗口崩了3個(gè)這個(gè)問題困擾了他一個(gè)月,后來才發(fā)現(xiàn)!

原來,游戲里規(guī)定,交易只能是一對(duì)一的他沒有在腳本中做處理

于是,啟動(dòng)腳本之后,所有的號(hào)都爭著和交易號(hào)進(jìn)行交易,

只有一個(gè)窗口搶到了和交易號(hào)交易的機(jī)遇,其它的窗口沒有搶到,就不斷循環(huán)判斷導(dǎo)致窗口崩潰

就像10個(gè)人爭搶一個(gè)茅坑一樣,1個(gè)人搶到了,其余9個(gè)人都掉坑里了……

怎么才能讓他們好好排隊(duì)上廁所呢?好多童鞋可能會(huì)立馬想到互斥體。

將交易的那段代碼用互斥體保護(hù)起來,當(dāng)一個(gè)線程在執(zhí)行交易代碼時(shí),其它的線程就無法進(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í)長為30秒。(假使一個(gè)交易操作需要3分鐘,則這里的使用時(shí)長設(shè)置為大于等于30分鐘。)當(dāng)?shù)谝粭l線程執(zhí)行到WaitForSingleObject函數(shù)時(shí),會(huì)獲取30秒的互斥體使用時(shí)長,在這30秒時(shí)間內(nèi),只有第一條線程可以執(zhí)行被互斥體保護(hù)起來的代碼段,其它的線程都在等待。

3、交易代碼執(zhí)行之后,調(diào)用Api函數(shù):ReleaseMutex函數(shù),釋放互斥體使用權(quán)當(dāng)30秒時(shí)間過后,第一條線程會(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_〞開頭并且加上12個(gè)隨機(jī)字母

隨機(jī)名稱這樣繁雜是為了避免名稱沖突,假使有一樣的名稱存在,那么當(dāng)前的互斥體就會(huì)創(chuàng)立失敗注意2:

代碼中還有一個(gè)CloseHandle函數(shù),被解釋掉了

由于,我們的主線程終止得比其它的十條線程快,所以當(dāng)十條線程還在創(chuàng)立啟動(dòng)的過程中,主線程就已經(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論