Lua使用心得 2

2022-03-27 18:53:05 字數 1260 閱讀 7553

在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...