在lua指令碼呼叫中,如果我們碰到一種不好的指令碼,例如:
while 1 do
doend
那我們的程式主線程也會被阻塞住。那我們如何防止這種問題呢?下面就給出乙個解決的辦法。
首先為了不阻塞主線程,那我們就要開乙個執行緒,把處理指令碼的操作都放在這個新開的工作執行緒裡。(要詳細了解工作執行緒和介面執行緒的區別和管理,請參看本人的另一篇文章blog下windows程式設計裡的《windows 執行緒漫談——介面執行緒和工作者執行緒》)。
總體思路:
1、開執行緒來執行指令碼解析,下面是startrun()
2、匯出乙個判斷是否結束函式,讓指令碼每個迴圈都呼叫,判斷執行緒是否該結束了,這個函式在下面是isthreadexit(),返回乙個字串("exit" 表示while迴圈該結束了,"notexit" 表示執行緒還不能結束)
3、如果主線程需要主動結束執行緒,就呼叫stoprun()
4、最好匯出乙個 ysleep 停頓函式,以免while迴圈裡執行太快,導致cpu被高占用。
按照這種思路,lua指令碼變成如下形式:
while 1 do
exitthread=isthreadexit();
ysleep(100);
if exitthread == "exit" then
break;
end;
end;
vc**如下,其中的output是乙個輸出函式,你可以用messagebox來代替:
// 全域性變數
// 標誌執行緒是否要結束
bool g_bexitdofile = false;
// 執行緒控制代碼
handle g_hdofile = null;
// 需要匯出的函式
// 讓 lua 判斷迴圈是否可以退出
static int isthreadexit(lua_state* l)
// 停頓函式
int ysleep(lua_state* l)
// 註冊以上函式
int regfunc()
// 執行緒啟動
int startrun(lpctstr strfilepath)
else
return 0;
}// 停止執行緒
int stoprun()
// 否則強硬殺掉執行緒
else
}return 0;
}上面這個方法是利用了執行緒的本身特性解決掉指令碼阻塞的問題。還可以使用lua本身的hooks機制來防止指令碼的阻塞,這個方法下次再說了。。。
Lua使用心得
這幾天研究了一下lua,主要關注的是lua和vc之間的整合,把 都寫好放在vc宿主程式裡,然後在lua裡呼叫宿主程式的這些 或者叫介面 元件,隨便你怎麼叫 希望能用指令碼來控制主程式的行為。這實際上也是一種把業務分離,用指令碼控制的架構,可能有些人把這種指令碼叫做業務引擎,工作流等。為什麼選擇lua...
TextMate使用心得2
詳細參考 option command l 顯示行號 資料夾拖到圖表上開啟,newproject拖拽 shift command f 全目錄搜尋文字 command t 全目錄搜尋檔案 shift command t option command 上箭頭,查詢相同檔名的不同檔案 fn command...
python urllib2使用心得
python urllib2使用心得 1 http get請求 過程 獲取返回結果,關閉連線,列印結果 f urllib2.urlopen req,timeout 10 the page f.read f.close print the page 2 http get請求 包頭 paras toke...