[BUG]HashTable目前已知Bug

各類的進階專題研究、WE Bug討論等。

版主: crassorz, tv580025

[BUG]HashTable目前已知Bug

文章AppleSheep » 2009年08月15日 11:07 pm

1.某些情況下 用 HashTable 來讀取一個不存在的 Handle 可能會造成War Error

例子

    globals
        hashtable MyHash = InitHashtable()
    endglobals

    function test nothing returns nothing
        local integer i
        local unit    u = CreateUnit(Player(0),'hpea',0,0,270)
            call SaveAgentHandle(MyHash,0,0,u)
            call RemoveUnit(u)
            set u = LoadUnitHandle(MyHash,0,0)  // 可能造成War Error  或結束後 Error
            call TriggerAddAction(1.0)
            set u = LoadUnitHandle(MyHash,0,0) // 可能造成War Error  或結束後 Error
            call BJDebugMsg("執行完畢 沒有問題")
    endfunction

2.使用Timer 與 HashTable 與 Trigger 可能造成線程被終止(包括線程來源的Timer)

例子

    globals
        hashtable MyHash = InitHashtable()
    endglobals

    function doany nothing returns nothing
        // ... Any Action ...
    endfunction

    function timerout nothing returns nothing
        local integer i  = 0
        local integer n  = GetRandomInt(10,100)
        local timer   t  = GetExpiredTimer()
        local integer id = GetHandleId()
        loop
            exitwhen i >= n
            call TriggerExecute(LoadTriggerHandle(MyHash,id,0)) // 有機率造成觸發終止
                                                                // 包括 Timer 也會停止
            set i = i + 1
        endloop
        call BJDebugMsg("隨機執行"+I2S(n)+"次 沒有問題")
    endfunction

    function test nothing returns nothing
        local timer   t  = CreateTimer()
        local integer id = GetHandleId(t)
        local trigger tr = CreateTrigger()
            call TriggerAddAction(tr,function doany)
            call SaveTriggerHandle(MyHash,id,0,tr)
            call TimerStart(t,2.5,true,function timerout)
    endfunction

一開始 蘋果以為是執行緒超過上限被斷 所以改成這樣來分離執行緒

    globals
        hashtable MyHash      = InitHashtable()
        trigger   TempTrigger = null
    endglobals

    function doany nothing returns nothing
        // ... Any Action ...
    endfunction

    function ExecuteTrigger nothing returns nothing
        call TriggerExecute(TempTrigger) // 依然有機率會斷
                                         // Timer 也不例外
    endfunction

    function timerout nothing returns nothing
        local integer i  = 0
        local integer n  = GetRandomInt(10,100)
        local timer   t  = GetExpiredTimer()
        local integer id = GetHandleId()
        loop
            exitwhen i >= n
            set TempTrigger = LoadTriggerHandle(MyHash,id,0)
            call ExecuteFunc("ExecuteTrigger")
            set i = i + 1
        endloop
        call BJDebugMsg("隨機執行"+I2S(n)+"次 沒有問題")
    endfunction

    function test nothing returns nothing
        local timer   t  = CreateTimer()
        local integer id = GetHandleId(t)
        local trigger tr = CreateTrigger()
            call TriggerAddAction(tr,function doany)
            call SaveTriggerHandle(MyHash,id,0,tr)
            call TimerStart(t,2.5,true,function timerout)
    endfunction

以上是目前蘋果發現的問題

回到頁頂

線上MSN

精華文章:
流連版 遺失的記憶
蘋果UI 最新1.8.8
Apple NewGen 與蘋果UI同步更新 (支援1.24)
Visual Jass (vJass) 教學 (初步完成)

圖檔
圖檔
圖檔
圖檔
頭像
AppleSheep
騎士
騎士
 
文章: 267
註冊時間: 2008年03月06日 11:23 am
來自: 虛無

回到 專題討論區

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客

cron