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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

來源:按鍵學院

故事就從一位童鞋的凄涼經歷說起吧。那是一個雷雨交加的夜晚

這位童鞋熬夜寫了一個關于《赤月傳聞》交易功能的多線程多開腳本??裣仓嗔ⅠR投身測試

測試的結果卻讓他的臉變成了屎色

他開了15個窗口,掛了半小時,就有10個窗口崩潰了。

他首先想到的是,會不會是電腦不給力,線程開多了導致的崩潰?于是,他只開了5個窗口

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

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

于是,啟動腳本之后,所有的號都爭著和交易號進行交易,

只有一個窗口搶到了和交易號交易的機遇,其它的窗口沒有搶到,就不斷循環(huán)判斷導致窗口崩潰

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

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

將交易的那段代碼用互斥體保護起來,當一個線程在執(zhí)行交易代碼時,其它的線程就無法進行交易操作。

為了便利大家學習和使用,我們的06老濕提供了一段Api創(chuàng)立互斥體的代碼范例~

API函數

要用到三個Api函數:CreateMutexWaitForSingleObjectReleaseMutex

步驟

1、調用Api函數:CreateMutex函數創(chuàng)立一個新的互斥體,并且將創(chuàng)立之后返回的互斥體句柄賦值給環(huán)境變量:交易

2、交易代碼執(zhí)行之前,調用Api函數:WaitForSingleObject函數,設置互斥體使用時長為30秒。(假使一個交易操作需要3分鐘,則這里的使用時長設置為大于等于30分鐘。)當第一條線程執(zhí)行到WaitForSingleObject函數時,會獲取30秒的互斥體使用時長,在這30秒時間內,只有第一條線程可以執(zhí)行被互斥體保護起來的代碼段,其它的線程都在等待。

3、交易代碼執(zhí)行之后,調用Api函數:ReleaseMutex函數,釋放互斥體使用權當30秒時間過后,第一條線程會釋放對互斥體的控制權,讓給下一條線程使用。

代碼

DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong

DeclareFunctionReleaseMutexLib\

DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong

'DeclareFunctionCloseHandlelib\

Dimenv交易交易=創(chuàng)立互斥體()For10

BeginThread游戲交易Next

Sub游戲交易()//綁定窗口//登錄帳號//尋覓npc

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

Call解鎖(交易)EndSub

Function創(chuàng)立互斥體()'/*隨機生成互斥體名稱DimTempStr,i

TempStr=\Fori=0To12Randomize

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

創(chuàng)立互斥體=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:

本例子中,在創(chuàng)立互斥體時,使用了隨機產生互斥體的名稱隨機名稱是以“anjian_mutex_〞開頭并且加上12個隨機字母

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

代碼中還有一個CloseHandle函數,被解釋掉了

由于,我們的主線程終止得比其它的十條線程快,所以當十條線程還在創(chuàng)立啟動的過程中,主線程就已經終止,并且觸發(fā)了腳本中止事件,執(zhí)行了關閉互斥體的命令這樣會導致,剛創(chuàng)立的互斥體被關閉的狀況

所以,假使主線程終止得比其他線程快,就不要使用關閉互斥體命令了互斥體所占用的內存空間并不大,不關閉也不影響

那么,假使游戲規(guī)定,登錄帳號和交易這兩個操作都只能一個一個進行操作呢?那么我們就需要設置兩個互斥體:登錄互斥體和交易互斥體代碼:

DeclareFunctionCreateMutexLib\AsLong,ByVallpNameAsString)AsLong

DeclareFunctionReleaseMutexLib\

DeclareFunctionWaitForSingleObjectLib\dwMillisecondsAsLong)AsLong

'DeclareFunctionCloseHandlelib\

Dimenv交易,登錄登錄=創(chuàng)立互斥體()交易=創(chuàng)立互斥體()For10

BeginThread游戲交易Next

Sub游戲交易()

//綁定窗口

Call鎖定(登錄,30000)//登錄帳號Call解鎖(登錄)

//尋覓npc

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

Call解鎖(交易)EndSub

Function創(chuàng)立互斥體()'/*隨機生成互斥體名稱DimTempStr,i

TempStr=\Fori=0To12Randomize

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

創(chuàng)立互斥體=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. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論