锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鎴戜嬌鐢ㄧ殑wxLua鐗堟湰淇℃伅涓?code>wxLua 2.8.7.0 built with wxWidgets 2.8.8錛屼篃灝辨槸LuaForWindows_v5.1.4-40.exe榪欎釜瀹夎鍖呴噷鑷甫鐨剋xLua銆傛垜涓嶇煡閬撳叾浠杦xWidgets鐗堟湰閲寃xListCtrl鎬庢牱錛屼絾鎴戜嬌鐢ㄧ殑鐗堟湰閲寃xListCtrl鏄笉鏀寔緙栬緫閲岄潰鐨勫瓙item鐨勩傚湪鎴戜嬌鐢ㄧ殑report妯″紡涓嬶紝瀛恑tem涔熷氨鏄壒瀹氭煇涓琛屼竴鍒楃殑item銆?/p>
google浜嗕竴涓嬶紝鍙戠幇鎮插墽鍦伴渶瑕佽嚜宸卞疄鐜幫紝涓昏灝辨槸鑷繁鏄劇ず涓涓獁xTextCtrl錛?/p>
鍏跺師鐞嗗氨鏄幏鍙栧埌褰撳墠榧犳爣鐐瑰嚮鎵鍦ㄧ殑瀛恑tem浣嶇疆錛岀劧鍚庡湪姝や綅緗樉紺轟竴涓獁xEditCtrl鍗沖彲銆備互涓婁唬鐮侀渶瑕佷緷璧栨垜涔嬪墠鍐欑殑Lua閲屽疄鐜扮畝鍗曠殑綾?瀵硅薄涓殑浠g爜錛屽悓鏃朵緷璧栦互涓嬮拡瀵箇xListCtrl鐨勬墿灞曟帴鍙o細 鍦ㄦ垜鐪嬪埌鐨剋xWidgets瀹樻柟鏂囨。閲岋紝鍏跺疄wxListCtrl宸茬粡鏈?code>GetSubItemRect鎺ュ彛錛屽茍涓斿湪鍙︿竴浜涚ず渚嬩唬鐮侀噷錛屼篃鐪嬪埌浜?code>GetItemText鎺ュ彛錛屼絾鏄紝鎴戜嬌鐢ㄧ殑鐗堟湰閲屾病鏈夛紝鎵浠ュ彧濂借嚜宸卞啓銆傚熀浜庝互涓婏紝瑕佷嬌鐢ㄨ繖涓彲浠ユ敮鎸佺紪杈戝瓙item鐨剋xListCtrl錛屽彲浠ワ細 涔熷氨鏄氳繃wx.wxListCtrlTextEdit榪欎釜鍑芥暟鍋氫笅澶勭悊錛岃繖涓嚱鏁拌繑鍥炵殑鏄湰韜殑wxListCtrl銆傚綋鐒舵洿濂界殑鏂瑰紡鏄嬌鐢ㄧ戶鎵夸箣綾葷殑鏂瑰紡錛屽紑鍙戜竴縐嶆柊鐨勬帶浠訛紝浣嗗湪Lua涓紝閽堝usedata綾誨瀷鐨勬墿灞曡矊浼煎彧鑳借繖鏍蜂簡銆?/p>
鏈濂藉悙妲戒笅錛岃繖涓帶浠舵墿灞曞叾瀹炲緢鎭跺績銆傛湰鏉ユ垜鎵撶畻褰撶紪杈戞帶浠跺け鍘葷劍鐐瑰悗灝遍殣钘忓畠錛屼絾鏄線緙栬緫鎺т歡涓婃敞鍐孠ILL_FOCUS浜嬩歡濮嬬粓涓嶈搗浣滅敤錛涙垜鍙堟墦綆楀紕涓狤SC閿洏浜嬩歡鍘繪墜鍔ㄥ彇娑堬紝浣嗘樉鐒秝xTextCtrl鏄笉鏀寔閿洏浜嬩歡鐨勩傚ソ鍚э紝鍑戝悎鐢ㄤ簡銆?/p>
--
-- file: wxListCtrlTextEdit.lua
-- author: Kevin Lynx
-- date: 08.06.2012
--
local EditList = {}
-- get the column by an abs point
function EditList:getColumn(x)
local cols = self.listctrl:GetColumnCount()
local cx = 0
for i = 0, cols - 1 do
local w = self.listctrl:GetColumnWidth(i)
if x <= cx + w then return i end
cx = cx + w
end
return -1
end
-- when a mouse down, show a text edit control
function EditList:onLeftDown(evt)
if self.editor:IsShown() then
self:closeEditor()
end
local p = evt:GetPoint()
local row = evt:GetIndex()
local col = self:getColumn(p.x)
local rect = wx.wxListCtrlEx.GetSubItemRect(self.listctrl, row, col)
rect:SetHeight(rect:GetHeight() + 5) -- adjust
self.editor:SetSize(rect)
self.editor:Show()
self.editor:SetValue(wx.wxListCtrlEx.GetItemText(self.listctrl, row, col))
self.editor:SetFocus()
self.col = col
self.row = row
end
function EditList:closeEditor()
if not self.editor:IsShown() then return end
self.editor:Hide()
self.listctrl:SetItem(self.row, self.col, self.editor:GetValue())
end
function EditList:initialize()
self.editor = wx.wxTextCtrl(self.listctrl, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_PROCESS_ENTER + wx.wxTE_RICH2)
self.editor:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, function () self:closeEditor() end)
-- not work actually
self.editor:Connect(wx.wxEVT_COMMAND_KILL_FOCUS, function () self:closeEditor() end)
self.editor:Hide()
end
function wx.wxListCtrlTextEdit(listctrl)
local o = {
listctrl = listctrl,
editor = nil,
}
local editlist = newObject(o, EditList)
editlist:initialize()
listctrl:Connect(wx.wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, function (evt) editlist:onLeftDown(evt) end)
listctrl:Connect(wx.wxEVT_COMMAND_LIST_ITEM_FOCUSED, function () editlist:closeEditor() end)
return listctrl
end
--
-- file: wxListCtrlExtend.lua
-- author: Kevin Lynx
-- date: 08.07.2012
-- brief: extend some util functions to wx.wxListCtrl
--
wx.wxListCtrlEx = {}
function wx.wxListCtrlEx.GetSubItemRect(listctrl, item, col)
local rect = wx.wxRect()
listctrl:GetItemRect(item, rect)
local x = 0
local w = 0
for i = 0, col do
w = listctrl:GetColumnWidth(i)
x = x + w
end
return wx.wxRect(x - w, rect:GetY(), w, rect:GetHeight())
end
function wx.wxListCtrlEx.GetItemText(listctrl, item, col)
local info = wx.wxListItem()
info:SetId(item)
info:SetColumn(col)
info:SetMask(wx.wxLIST_MASK_TEXT)
listctrl:GetItem(info)
return info:GetText()
end
list = wx.wxListCtrlTextEdit(wx.wxListCtrl(dialog, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxLC_REPORT))
鎴戜滑浣跨敤tolua++鎵嬪伐緇戝畾c/c++鎺ュ彛鍒發ua涓紝鍦ㄧ粦瀹氱殑鎺ュ彛瀹炵幇閲岋紝灝遍渶瑕佸彇鍑轟紶鍏ョ殑鍙傛暟銆倀olua++涓彁渚涗簡涓緋誨垪tolua_toxxx鍑芥暟錛屼緥濡傦細
lua_Number tolua_tonumber(lua_State *L, int narg, lua_Number def)
const char *tolua_tostring(lua_State *L, int narg, const char *def)
榪欎簺鍑芥暟閮芥湁涓涓猟ef鍙傛暟銆備箥涓鐪嬶紝榪欎簺鍑芥暟浣跨敤璧鋒潵寰堢畝鍗曘備紶鍏ua_State錛屼紶鍏ュ弬鏁板湪鏍堜腑鐨勪綅緗紝鐒跺悗鍐嶄紶涓涓?strong>澶辮觸鍚庤繑鍥炵殑榛樿鍊箋?/p>
鎴戦噸鐐硅璇寸殑鏄繖閲岃繖涓?strong>澶辮觸錛屾寜姝e父紼嬪簭鍛樼殑鐞嗚В錛岄拡瀵筶ua鑰岃█錛屼粈涔堟儏鍐典笅綆楀け璐ュ憿錛焞ua璇█閲屽嚱鏁板弬鏁版敮鎸佷笉浼狅紝姝ゆ椂瀹炲弬涓簄il錛屽皢nil杞崲涓轟竴涓猚綾誨瀷蹇呯劧澶辮觸錛涘弬鏁扮被鍨嬩笉姝g‘綆椾笉綆楀け璐ワ紵浣犱紶涓涓猽ser data錛宑閲屾寜鏁板瓧鏉ュ彇錛岃繖涔熺畻澶辮觸銆?/p>
榪欎箞綆鍗曠殑API榪橀渶瑕佸綰犵粨浠涔堝憿錛熺劧鍚庢垜浠旦嫻╄崱鑽″湴鍐欎簡涓婄櫨涓帴鍙o紝浠涔坱olua_tostring/tolua_tonumber鐨勪嬌鐢ㄥ皯璇翠篃鏈?00浜嗗惂錛?/p>
鐒跺悗鏈変竴澶╋紝鏈嶅姟鍣ㄥ畷鏈轟簡錛岀┖鎸囬拡:
/* 澶辮觸榪斿洖""錛岃繕鑳界渷絀烘寚閽堢殑鍒ゆ柇 */
const char *name = tolua_tostring(L, 1, "");
if (name[0] == '\0') { /* 絀轟覆鎬誨緱鍒ゆ柇鍚?*/
...
}
璺熻釜鍚庡彂鐜幫紝鑴氭湰閲屼紶鍏ョ殑鏄痭il錛岃繖閲岀殑name鍙栧嚭鏉ユ槸NULL錛岃屼笉鏄?#8221;“錛堢殑鍦板潃錛夈傜劧鍚庡悙妲戒簡涓涓嬭繖涓狝PI錛岃緵鑻﹀湴淇敼浜嗘墍鏈夌被浼間唬鐮侊紝澧炲姞瀵圭┖鎸囬拡鐨勫垽鏂傛垜娌℃湁澶氭兂銆?/p>
鏁呬簨緇х畫錛屾湁涓澶╂湇鍔″櫒铏界劧娌″畷鏈猴紝浣嗗姛鑳戒笉姝e父浜?
float angle = (float) tolua_tonumber(L, 1, 2 * PI);
...
榪欎釜鎰忔濇槸錛岃繖涓嚱鏁扮殑鍙傛暟1榛樿鏄?*PI錛屼粈涔堟槸榛樿錛焞ua閲屾煇鍑芥暟鍙傛暟涓嶄紶錛屾垨浼爊il灝辨槸浣跨敤榛樿銆傚洜涓轟笉浼犵殑璇濓紝榪欎釜瀹炲弬鏈韓灝辨槸nil銆備絾錛宼olua_tonumber鐨勮涓轟笉鏄繖鏍風殑錛屽畠鐨勫疄鐜扮湡鏄伔鎳?
TOLUA_API lua_Number tolua_tonumber (lua_State* L, int narg, lua_Number def)
{
return lua_gettop(L)<abs(narg) ? def : lua_tonumber(L,narg);
}
TOLUA_API const char* tolua_tostring (lua_State* L, int narg, const char* def)
{
return lua_gettop(L)<abs(narg) ? def : lua_tostring(L,narg);
}
鎰忔濇槸錛屽彧鏈夊綋浣犱笉浼犵殑鏃跺欙紝瀹冩墠榪斿洖榛樿鍊鹼紝鍚﹀垯灝變氦緇檒ua鐨凙PI鏉ョ錛岃宭ua榪欎簺API鏄笉鏀寔搴旂敤灞傜殑榛樿鍙傛暟鐨勶紝瀵逛簬lua_tonumber閿欒鏃跺氨榪斿洖0錛宭ua_tostring閿欒鏃跺氨榪斿洖NULL銆?/p>
榪欑鍏惰涓哄拰鍏跺甫鏉ョ殑common sense涓嶄竴鑷寸殑API璁捐錛屽疄鍦ㄨ浜鴻泲鐤箋備粈涔堟槸common sense鍛紵灝卞儚涓涓猆I搴撻噷鐨勬寜閽紝鎴戜滑閮界煡閬撴湁click浜嬩歡錛宧over浜嬩歡錛孶I搴撶殑鏂囨。鐢氳嚦閮戒笉闇瑕佽В閲婁粈涔堟槸click浠涔堟槸hover錛屽洜涓哄ぇ瀹剁湅鍒拌繖涓笢瑗匡紝灝辨湁浜嗗叡璇嗭紝鏃犻渶搴熻瘽錛岃繖灝辨槸common sense銆傚氨鍍弔olua鐨勮繖浜汚PI錛岄潪甯告櫘閫氾紝澶у涓鐪嬮兘鏈熷緟鍦ㄦ剰澶栨儏鍐典笅浣犺兘榪斿洖def鍊箋備絾瀹冪珶鐒朵笉鏄傚疄鍦ㄤ笉琛岋紝浣犲彲浠ユā浠縧ua鐨刢heck緋誨垪鍑芥暟鐨勫疄鐜板槢:
LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {
lua_Number d = lua_tonumber(L, narg);
if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */
tag_error(L, narg, LUA_TNUMBER);
return d;
}
鍗籌紝鏍規湰涓嶇敤鍘繪鏌ユ爤闂錛岀洿鎺ュ湪lua_tonumber涔嬪悗鍐嶅仛鍖呰媯鏌ャ備綍鍐碉紝lua闇瑕佷綘鍘繪鏌ユ爤鍚楋紵褰撲綘璁塊棶浜嗘爤澶栫殑鍏冪礌鏃訛紝lua浼氳嚜鍔ㄨ繑鍥炰竴涓叏灞甯擱噺luaO_nilobject:
static TValue *index2adr(lua_State *L, int idx) {
...
if (o >= L->top) return cast(TValue*, luaO_nilobject);
}
鍙︼紝紼嬪簭鎮插墽涔熸潵婧愪簬鑷嗘兂銆?/p>
在Lua中,因为函数也是第一类值,所以会出现将函数作为另一个函数的参数,或者函数作 为函数的返回值。这种机制在很多地方都能代码更灵活更简洁,例如:
table.sort(table [,comp])
这里的comp就要求传入一个函数,我们在调用时,大概会有如下形式:
table.sort(t, comp) -- 直接写函数名 table.sort(t, local_comp) -- 某个局部函数 table.sort(t, function (a, b) xxx end ) -- 临时构造一个匿名函数
其中最后一种方式最为灵活,任意时候在需要的时候构造一个匿名函数。这种在Lua自身的 环境中使用,自然没有问题。但是,当我们在C/C++中注册一些函数到Lua环境中,而这些 函数也需要使用函数参数的时候,问题就出来了。
Lua本身是不支持将Lua函数作为函数参数传入C/C++的,不管这个想要传入的函数是全局的 、局部的、或者匿名的(匿名的本质上也算局部的)。一般情况下,我们唯一的交互方式, 不是传入一个函数,而是一个全局函数名。C/C++保存这个函数名,在需要回调Lua的时候, 就在Lua全局表中找到这个函数(根据函数名),然后再调用之。情况大致如下:
function lua_func () xxx end
cfunc(lua_func) -- wrong
cfunc("lua_func") -- right
我们这回的脚本模块,策划会大量使用需要回调函数的C/C++函数。显然,创建大量的全局 函数,先是从写代码的角度看,就是很伤神的。
我们最终需要的方式,大概如下:
cfunc(lua_func) -- ok cfunc(function () xxx end) -- ok local xxx = function () xxx end cfunc(xxx) -- ok
要解决这个问题,我的思路是直接在Lua层做一些包装。因为C/C++那边仅支持传入一个全局 函数名(当然不一定得全局的,根据实际情况,可能在其他自己构造的表里也行),也就是 一个字符串,所以我的思路就是将Lua函数和一个唯一的字符串做映射。:
function wrap (fn)
local id = generate_id()
local fn_s = "__callback_fn"..id
_G[fn_s] = fn
return fn_s
end
这个wrap函数,就是将一个函数在全局表里映射到一个字符串上,那么在使用时:
cfunc(wrap(function () xxx end)) cfunc(const char *fn_name, xxx); -- cfunc的原型
cfunc是C/C++方注册进Lua的函数,它的原型很中规中矩,即:只接收一个函数名,一个字 符串,如之前所说,C/C++要调用这个回调函数时,就根据这个字符串去查找对应的函数。 脚本方在调用时,如果想传入一个匿名函数了,就调用wrap函数包装一下即可。
上面的方法有个很严重的问题,在多次调用wrap函数后,将导致全局表也随之膨胀。我们需 要想办法在C/C++完成回调后,来清除wrap建立的数据。这个工作当然可以放到C/C++来进行 ,例如每次发生回调后,就设置下全局表。但这明显是不对的,因为违背了接口的设计原则 ,这个额外的机制是在Lua里添加的,那么责任也最好由Lua来负。要解决这个问题,就可以 使用Lua的metamethods机制。这个机制可以在Lua内部发生特定事件时,让应用层得到通知。 这里,我们需要关注__call事件。
Lua中只要有__call metamethod的值,均可被当作函数调用。例如:
ab(1, 2)
这里这个函数调用形式,Lua就会去找ab是否有__call metamethod,如果有,则调用它。这 个事实暗示我们,一个table也可以被调用。一个改进的wrap函数如下:
local function create_callback_table (fn, name)
local t = {}
t.callback = fn
setmetatable (t, {__call = -- 关注__call
function (func, ...) -- 在t(xx)时,将调用到这个函数
func.callback (...) -- 真正的回调
del_callback (name) -- 回调完毕,清除wrap建立的数据
end })
return t
end
function wrap (fn)
local id = generate_func_id() -- 产生唯一的id
local fn_s = "_callback_fn"..id
_G[fn_s] = create_callback_table(fn, fn_s) -- _G[fn_s]对应的是一个表
return fn_s
end
在我们的C/C++程序中,依然如往常一样,先是从_G里取出函数名对应的对象。虽然这个对 象现在已经是一个table。然后lua_call。
上面的代码是否会在原有基础上增加不可接受的性能代价?虽然我没有做过实际测试,但是 从表明看来,排除meta table在Lua里的代价,也就多了几次Lua函数调用。
最后,感叹一下,Lua里的table及metatable机制,实在非常强大。这种强大不是功能堆砌 出来的强大,而是简单东西组合出来的强大。其背后的设计思想,着实让人佩服。
4.26.2011 Update
之前的文中说“Lua本身是不支持将Lua函数作为函数参数传入C/C++的“,这句话严格来说不 正确(由某网友评论)。假设函数cfun由c/c++注册,我们是可以编写如下代码的:
cfunc(print) -- 传入Lua函数
但是问题在于,我们无法取出这个函数并保存在c/c++方。Lua提供了一些接口用于取cfunc 的参数,例如luaL_checknumber(封装lua_tonumber)。但没有类似luaL_checkfunction的 接口。Lua中的table有同样的问题。究其原因,主要是Lua中的函数没有直接的c/c++数据结 构对应。
;; END
鍙︿竴涓悓浜嬪湪iptux鐨勫熀紜涓婁慨鏀圭殑錛岀粨鏋滃ぇ姒傛槸鍥犱負iptux鐨勪唬鐮佷笉鏄偅涔堝鏄撲慨鏀癸紝灝變笉浜嗕簡涔嬩簡銆傝繖涓?/font>
鍒氬彂甯冪殑luafeiq鍔熻兘闈炲父綆鍗曪紝浠呮敮鎸佷笌椋炵錛堝寘鎷ぇ閮ㄥ垎鍏煎IP messager鐨処M錛夎繘琛屽崟鑱婏紝緹?/font>娑堟伅鐨?/font>
鏀跺彂錛岀畝鏄撶殑娑堟伅鐩掑瓙錛堟殏瀛樻湭璇繪秷鎭級銆傚洜涓洪夌殑搴撻兘鏄法騫沖彴鐨勶紝鎵浠ュ緢瀹規槗鐨刲uafeiq涔熸槸璺?/font>騫沖彴鐨勶紝
鏈涓昏鐨勬槸鎴戞兂鍦╨inux涓嬩嬌鐢ㄣ?/font>
涔嬫墍浠ラ夌敤lua錛屼竴鏂歸潰鏄兂緇冪粌lua錛屽彟涓鏂歸潰鍒欐槸鍥犱負寮鍙戞晥鐜囥傚墠孌墊椂闂村湪android涓嬪啓浜嗕簺java浠g爜錛?/font>
鐢╦ava鍐欎唬鐮佽寰楃敋涓虹埥蹇紙褰撶劧綆椾笉浜嗗畬緹庯級銆傝繖鍑犲ぉ鍐欎簡鍗冩妸琛岀殑lua錛堜篃璁告湁3K琛岋紝鏈粺璁¤繃錛夛紝
鎰熻涔熶笉閿欍傜患鍚堟潵璇達紝榪欎簺楂樼駭璇█鐨勫緢澶氬ソ鐢ㄧ殑璇硶鐗規э紝渚嬪闂寘錛坈losure錛夛紝鍨冨溇鍥炴敹錛岄兘鎻愰珮
浜嗕笉灝戝啓浠g爜鐨勯熷害銆傚綋鐒訛紝lua浜庢垜鑰岃█涔熺畻涓嶄笂瀹岀編鐨勮璦銆備緥濡傛垜緇忓父鍥犱負鍙橀噺鏁查敊瀛楁瘝錛岃屽湪榪愯鏃?/font>
鎵嶆毚闇瞡il閿欒銆傝繖涔熻鍙互閫氳繃璇稿IDE涔嬬被鐨勫伐鍏峰湪鍐欎唬鐮佺殑鏃跺欏氨緇欎簣鎻愮ず銆俵ua 鍦ㄩ亣鍒頒竴涓鍙鋒椂錛?/font>
榛樿鍦板皢鍏跺鐞嗕負鍏ㄥ眬鐨勩傚叧浜庤繖涓娉曠壒鎬ф棭鏈変漢鎻愬嚭涓嶇埥錛屽彧鑳借澶у璁捐鐨勫噯鍒欎笉涓鏍楓傦紙鍦ㄦ垜浠?/font>
欏圭洰閲岋紝鎴戠洿鎺ユ敼鍐欎簡鍏ㄥ眬鍙橀噺鐨刴etatable錛屼粠鑰岄槻姝㈢瓥鍒掗殢鎰忓畾涔夊叏灞鍙橀噺錛?/font>
鍐嶆潵璋堣皥瀹炵幇榪囩▼涓殑涓浜涚悙浜嬨傚洜涓洪縐嬩篃綆楁槸IP messager鍗忚鐨勫吋瀹瑰疄鐜幫紝寰堝閫氫俊闄や簡鍙互浣跨敤
鎶撳寘杞歡鍒嗘瀽澶栵紝榪樺彲浠ョ洿鎺ラ氳繃IP messager鐨勬簮鐮佹潵浜嗚В銆傛墍浠ワ紝鍩虹閫氫俊鍗忚鐨勫疄鐜拌繃紼嬩篃姣旇緝
綆鍗曘傞縐嬩笌椋炵涔嬮棿鍙戦佺鑱婃秷鎭槸緇忚繃鍔犲瘑鐨勩傚叾鍔犲瘑榪囩▼涔熶笉綆鍗曪紝鏇撮噸瑕佺殑鏄紝鎴戝茍涓嶆兂嫻垂澶?/font>
澶氭椂闂村湪榪欎笂闈€傚悗鏉ュ彂鐜板叾瀹炲彲浠ラ氳繃涓婄嚎娑堟伅閲屾煇涓爣蹇椾綅琛ㄦ槑鑷繁涓嶉渶瑕佸姞瀵嗐傝繖涓爣蹇楀氨鏄秷鎭ご
閲岀殑option銆備笂綰垮箍鎾嚭鍘葷殑娑堟伅閲屼竴鏃﹁〃鏄庤嚜宸變笉鍔犲瘑錛岄偅涔堜互鍚庡拰椋炵閫氫俊涔熷氨涓嶉渶瑕佽В瀵嗕簡銆?/font>
鍙戦佺鑱婃秷鎭椂錛屾秷鎭噷浼氭惡甯︿竴涓秷鎭疘D銆傝繖涓狪D鍙互閫氳繃浠繪剰綆楁硶鐢熸垚錛屼緥濡傜洿鎺ュ彇time鐨勫箋傛帴鏀跺埌
瀵規柟鐨勬秷鎭椂錛岄渶瑕佸彇鍑鴻ID錛岀劧鍚庡姞鍏ュ洖搴旀秷鎭傚鏂規敹鍒板洖搴旀秷鎭悗錛屽氨鐭ラ亾鑷繁鍙戦佹垚鍔熴傝繖涓繃紼?/font>
綆楁槸ip messager鍦║DP涓婂仛鐨勬秷鎭彲闈犻獙璇侊紝榪囩▼涔熸瘮杈冪畝鍗曘?/font>
緹よ亰娑堟伅鍦ㄤ箣鍓嶆彁鍒拌繃錛屾槸閫氳繃UDP澶氭挱瀹炵幇銆傛垜浠彲浠ユ帴鏀舵墍鏈夌兢鐨勬秷鎭傚鏋滀箣鍓嶅凡緇忓浜庢煇涓兢閲岋紝
閭d箞涓鏃︿綘涓婄嚎鍚庯紙騫挎挱涓婄嚎娑堟伅錛夛紝浣犲氨鍙互鐩存帴鍦ㄨ繖涓兢閲屽彂璦銆備絾濡傛灉浣犱箣鍓嶄笉鍦ㄨ繖涓兢閲岋紝鍒?/font>
鍙互閫氳繃澶氭挱涓涓姞鍏ョ兢鐨勬秷鎭紝鐒跺悗灝卞彲浠ヤ笉璇瘋嚜鏉ュ湴鍦ㄨ繖涓兢閲屽彂璦銆傝緇嗙殑娑堟伅鍊煎拰瀹炵幇閮藉彲浠ヤ粠
luafeiq鐨勪唬鐮侀噷璇誨埌錛坢essage_sender.lua錛夈?/font>
鍦╨inux涓嬫帴鏀秝indows涓婄殑椋炵娑堟伅錛屾槸闇瑕佸仛瀛楃緙栫爜杞崲鐨勩傚洜涓簂uafeiq浣跨敤IUP浣滀負UI搴擄紝IUP鍦?/font>
linux涓嬩嬌鐢℅TK浣滀負搴曞眰瀹炵幇錛岄粯璁ゅ叏閮ㄦ槸UTF8緙栫爜銆俵uafeiq閲屾垜鑷繁鍐欎簡涓猯ua搴擄紝鐢ㄤ簬緙栫爜杞崲銆?/font>
璇濊IUP浣滀負涓涓猆I搴擄紝榪樻槸姣旇緝涓嶉敊鐨勩傛濡傚叾浠嬬粛鏂囨。閲屾墍璇達紝瀛︿範鏇茬嚎浣庯紝鍩烘湰涓婄湅涓浼氭枃妗o紝灝卞彲浠?/font>
鐩存帴浣跨敤浜嗐俵uafeiq浣跨敤鐨処UP鐗堟湰鑷沖皯闇瑕?.0浠ヤ笂銆傚綋鍒濆湪linux涓嬩負浜嗗畨瑁匢UP3.3錛屽熀鏈姳浜?涓皬鏃?/font>
鏃墮棿錛屽悇縐嶅鎬殑娌″澶ф剰涔夌殑閿欒淇℃伅銆傚悗鏉ユ崲鎴?.2鐗堟湰錛屽眳鐒朵竴涓嬪瓙灝卞拰璋愪簡錛屾棤闄愭ㄥ康銆?/font>
luafeiq鐩墠鏀懼湪googlecode鐨勭増鏈紝鍙互璇存槸涓涓緢涓嶈礋璐d換鐨勭増鏈傛棭涓婃垜鎵嶅垰鎶婂瓧絎︾紪鐮佽漿鎹㈢殑浠g爜
璋冭瘯濂姐備粖澶╁凡緇忚鍋囷紝瀹墮噷灝變竴鍙扮數鑴戯紝涔熷氨嫻嬭瘯涓嶄簡榪欎釜瀛楃緙栫爜杞崲鏄惁鐪熺殑鑳芥甯稿伐浣溿傛垜鍦?/font>
windows涓媎ump浜嗕簺瀛楃錛岀湅涓婂幓鑳芥甯稿姛鑳姐傛槑澶╁緱鍥炶佸榪囨槬鑺傦紝涓婁笉浜嗙綉錛岀儲鎬у氨鎻愬墠鍙戝竷浜嗐?/font>
luafeiq欏圭洰鍦板潃錛?a title="http://code.google.com/p/luafeiq/" >http://code.google.com/p/luafeiq/
璇寸櫧浜嗭紝涔熷氨鏄璁﹖olua++鍦ㄧ敓鎴愮殑浠g爜鏂囦歡寮澶存彃鍏?include "stdafx.h"銆?
淇敼浠g爜鍏跺疄寰堢畝鍗曘倀olua++鍒嗘瀽pkg鏂囦歡鍙婄敓鎴愪唬鐮佹枃浠跺叾瀹為兘鏄氳繃lua浠g爜瀹屾垚鐨勩?br>鍦╯rc/bin/lua鐩綍涓嬶紝鎴栬呭湪婧愪唬鐮侀噷toluabind.c閲岋紙鎶婂搴旂殑lua浠g爜鐩存帴浠SCII鐮佸?br>澶嶅埗浜嗚繃鏉ワ級鍗充負榪欎簺浠g爜銆?
棣栧厛淇敼package.lua閲岀殑classPackage::preamble鍑芥暟錛屽彲浠ョ湅鍑鴻鍑芥暟浼氱敓鎴愪竴浜涗唬鐮?br>鏂囦歡澶達紝妯′豢鐫鍗沖彲鍐欎笅濡備笅浠g爜錛?
if flags['I'] then
output( '#include "..flags['I'] )
end
浠庝笂涓嬫枃浠g爜鍙互鐪嬪嚭flags鏄釜鍏ㄥ眬鍙橀噺錛屼繚瀛樹簡鍛戒護琛屽弬鏁般?
鐒跺悗淇敼tolua.c浠g爜鏂囦歡錛岃鍏跺線lua鐜閲屼紶鍏ュ懡浠よ鍙傛暟錛?
case 'I':setfield(L,t,"I",argv[++i];break;
鏈潵錛岃繖鏍蜂慨鏀瑰悗鍩烘湰灝卞彲浠ヨtolua++鏀寔閫氳繃鍛戒護琛屾寚瀹氭槸鍚︽彃鍏ラ緙栬瘧澶達細
tolua++ -o test.cpp -H test.h -I stdafx.h test.pkg
涓嶈繃浜嬫儏騫墮潪寰堥『鍒╋紝閫氳繃寮鍚疶OLUA_SCRIPT_RUN瀹忔潵璁﹖olua++閫氳繃src/bin/lua涓嬬殑lua
浠g爜鏉ュ畬鎴愬姛鑳斤紝緇撴灉鍚庢潵鍙戠幇basic.lua浼間箮鏈夐棶棰樸傛棤濂堜箣涓嬶紝鍙ソ鐢╳inhex涔嬬被鐨勫伐
鍏鋒妸淇敼榪囩殑package.lua杞崲涓簎nsigned char B[]緗簬toluabind.c閲岋紝鍗沖彲姝e父澶勭悊銆?
寰堟棭鍓嶅湪鎶樿吘鎸傝搗LUA鑴氭湰鏀寔鏃訛紝鎺ヨЕ鍒發ua_yield榪欎釜鍑芥暟銆俵ua manual涓粰鐨勮В閲婃槸錛?
This function should only be called as the return expression of a C function銆?
鑰岃繖涓嚱鏁頒竴鑸槸鍦ㄤ竴涓敞鍐屽埌LUA鐜涓殑C鍑芥暟閲岃璋冪敤銆俵ua_CFunction瑕佹眰鐨勫師鍨嬮噷
錛屽嚱鏁扮殑榪斿洖鍊煎繀欏昏繑鍥炶榪斿洖鍒癓UA鑴氭湰涓殑鍊肩殑涓暟銆備篃灝辨槸璇達紝鍦ㄤ竴涓笉闇瑕佹寕璧風殑
lua_CFunction瀹炵幇閲岋紝涔熷氨鏄竴涓笉闇瑕乺eturn lua_yield(...鐨勫疄鐜伴噷錛屾垜搴旇return
涓涓繑鍥炲間釜鏁般?
浣嗘槸涓轟粈涔堣皟鐢╨ua_yield灝卞繀欏繪斁鍦╮eturn琛ㄨ揪寮忛噷錛熷綋鏃跺緢澶╃湡錛屾病鍘繪繁絀訛紝鍙嶆鍙戠幇
涓嶆寜鐓ua manual閲岃鐨勫仛灝辨槸涓嶈銆傝屼笖鍏抽敭鏄紝lua manual灝變笉鍛婅瘔浣犱負浠涔堛?
鏈榪戠獊鐒跺氨鎯沖埌榪欎釜闂錛屽喅瀹氬幓鎼炴竻妤氳繖涓棶棰樸備警鎹瘋浜嗭紝婧愮爜闈㈠墠浜嗘棤縐樺瘑銆傛垜鐢氳嚦
鍦ㄧ湅浠g爜涔嬪墠錛岃繕鐞㈢(鐫LUA鏄笉鏄搷浣滀簡鍫嗘爤錛堢郴緇熷爢鏍堬級涔嬬被鐨勪笢瑗褲傜粨鏋滈殢渚胯窡浜嗕笅
浠g爜鐪熺殑璁╂垜寰堟睏棰溿傛湁鏃跺欎漢鐘偦浜嗙湡鐨勬槸涓涓偛鍓с傝綆鍗曠殑涓涓棶棰樹細琚漢鎼炲緱寰堢
縐橈細
瑙i噴鎵ц璋冪敤涓涓敞鍐岃繘LUA鐨刲ua_CFunction鏄湪ldo.c閲岀殑luaD_precall鍑芥暟閲岋紝鏈夊涓?br>浠g爜錛?
n = (*curr_func(L)->c.f)(L); /* do the actual call */
lua_lock(L);
if (n < 0) /* yielding? */
return PCRYIELD;
else {
luaD_poscall(L, L->top - n);
return PCRC;
}
澶氱殑鎴戝氨涓嶈浜嗭紝鍒漢娉ㄩ噴鍐欏緱寰堟竻妤氫簡錛屾敞鍐岃繘鍘葷殑lua_CFunction濡傛灉榪斿洖鍊煎皬浜?錛岃繖
涓嚱鏁板氨鍚戜笂灞傝繑鍥濸CRYIELD錛屼粠鍚嶅瓧灝卞彲鐪嬪嚭鏄憡璇変笂灞傞渶瑕乊IELD銆傚啀鎵懼埌lua_yield鍑?br>鏁扮殑瀹炵幇錛屾伆濂借鍑芥暟灝辮繑鍥?1銆?
瑕佸啀寰涓婂眰璺燂紝浼氬埌lvm.c閲宭uaV_execute鍑芥暟錛岀湅璧鋒潵搴旇灝辨槸铏氭嫙鏈哄湪瑙i噴鎵ц鎸囦護錛?
case OP_CALL: {
int b = GETARG_B(i);
int nresults = GETARG_C(i) - 1;
if (b != 0) L->top = ra+b; /* else previous instruction set top */
L->savedpc = pc;
switch (luaD_precall(L, ra, nresults)) {
case PCRLUA: {
nexeccalls++;
goto reentry; /* restart luaV_execute over new Lua function */
}
case PCRC: {
/* it was a C function (`precall' called it); adjust results */
if (nresults >= 0) L->top = L->ci->top;
base = L->base;
continue;
瀵逛簬PCRYIELD榪斿洖鍊鹼紝鐩存帴蹇界暐澶勭悊浜嗐?
闇姹?/strong>
鍙梂OW鐨勫獎鍝嶏紝LUA瓚婃潵瓚婂鍦拌搴旂敤浜庢父鎴忎腑銆傝剼鏈鐢ㄤ簬娓告垙涓富瑕佺敤浜庣瓥鍒掔紪鍐欐父鎴忚鍒欑浉鍏熾傚疄闄呰繍鐢ㄤ腑錛?br>鎴戜滑浼氬皢寰堝瀹夸富璇█鍑芥暟緇戝畾鍒癓UA鑴氭湰涓紝浣胯剼鏈彲浠ユ洿澶氬湴鎺у埗紼嬪簭榪愯銆備緥濡傛垜浠彲浠ョ粦瀹歂PCDialog涔嬬被鐨勫嚱鏁?br>鍒癓UA涓紝鐒跺悗絳栧垝渚垮彲浠ュ湪鑴氭湰閲屾帶鍒舵父鎴忎腑寮瑰嚭鐨凬PC瀵硅瘽妗嗐?br> 鎴戜滑鐜板湪闈復榪欐牱鐨勯渶姹傦細瀵逛簬瀹夸富紼嬪簭鑰岃█錛屾煇浜涘姛鑳芥槸涓嶈兘闃誨紼嬪簭閫昏緫鐨勶紙瀵逛簬娓告垙紼嬪簭灝ゅ叾濡傛錛夛紝浣嗘槸涓?br>浜嗘柟渚跨瓥鍒掞紝鎴戜滑鍙堥渶瑕佽鑴氭湰鐪嬭搗鏉ヨ闃誨浜嗐傜敤NPCDialog涓句釜渚嬪瓙錛屽湪鑴氭湰涓湁濡備笅浠g爜 錛?br>
ret = NPCDialog( "Hello bitch" )
if ret == OK then print("OK") end
瀵逛簬絳栧垝鑰岃█錛孨PCDialog搴旇鏄樆濉炵殑錛岄櫎闈炵帺瀹舵搷浣滄瀵硅瘽妗嗭紝鐐瑰嚮OK鎴栬呭叧闂紝涓嶇劧璇ュ嚱鏁頒笉浼氳繑鍥炪傝屽浜?br>瀹夸富紼嬪簭C++鑰岃█錛屾垜浠浣曞疄鐜拌繖涓嚱鏁板憿錛?
static int do_npc_dialog( lua_State *L )
{
const char *content = lua_tostring( L, -1 );

lua_pushnumber( ret );
return 1;
}
鏄劇劧錛岃鍑芥暟涓嶈兘闃誨錛屽惁鍒欏畠浼氶樆濉炴暣涓父鎴忕嚎紼嬶紝榪欏浜庢湇鍔″櫒鑰岃█鏄笉鍙鐨勩備絾鏄鏋滆鍑芥暟绔嬪嵆榪斿洖錛岄偅
涔堝畠騫舵病鏈夋敹闆嗗埌鐜╁瀵逛簬閭d釜瀵硅瘽妗嗙殑鎿嶄綔銆?br> 緇間笂錛屾垜浠鍋氱殑鏄紝璁╄剼鏈劅瑙夋煇涓搷浣滈樆濉烇紝浣嗕簨瀹炰笂瀹夸富紼嬪簭騫舵病鏈夐樆濉炪?
浜嬩歡鏈哄埗
涓涓渶綆鍗曠殑瀹炵幇錛堝浜嶤紼嬪簭鍛樿岃█涔熻涔熸槸浼樼編鐨勶級錛屽氨鏄嬌鐢ㄤ簨浠舵満鍒躲傛垜浠皢瀵硅瘽妗嗙殑鎿嶄綔緇撴灉浣滀負涓涓簨浠躲?br>鑴氭湰閲屼簨瀹炰笂娌℃湁鍝釜鍑芥暟鏄樆濉炵殑銆備負浜嗗鐞嗕竴浜?#8220;闃誨”鍑芥暟鐨勫鐞嗙粨鏋滐紝鑴氭湰鍚戝涓葷▼搴忔敞鍐屼簨浠跺鐞嗗櫒錛堝悓GUI浜嬩歡
澶勭悊鍏跺疄鏄竴鏍風殑錛夛紝渚嬪鑴氭湰鍙互榪欐牱錛?br>
function onEvent( ret )
if ret == OK then print("OK") end
end
-- register event handler
SetEventHandler( "onEvent" )
NPCDialog("Hello bitch")
瀹夸富紼嬪簭淇濆瓨浜嬩歡澶勭悊鍣╫nEvent鍑芥暟鍚嶏紝褰撶帺瀹舵搷浣滀簡瀵硅瘽妗嗗悗錛屽涓葷▼搴忓洖璋冭剼鏈腑鐨刼nEvent錛屽畬鎴愭搷浣溿?br> 浜嬪疄涓婃垜鐩鎬俊鏈夊緢澶氫漢紜疄鏄繖涔堝仛鐨勩傝繖鏍峰仛鍏跺疄灝辨槸鎶婁竴涓『搴忔墽琛岀殑浠g爜嫻侊紝鍒嗘垚浜嗗緢澶氬潡銆備絾鏄浜巗leep
榪欐牱鐨勮剼鏈皟鐢ㄥ憿錛熶緥濡傦細
--do job A
sleep(10)
--do job B
sleep(10)
--do job C

閭d箞閲囩敤浜嬩歡鏈哄埗灝嗗彲鑳戒細鎶婁唬鐮佸垎瑙d負錛?br>
function onJobA
--do job A
SetEventHandlerB("onJobB")
sleep(10)
end
function onJobB
--do job B
SetEventHandlerC("onJobC")
end
function onJobC
--do job C
end
-- script starts here
SetEventHandlerA( "onJobA" )
sleep(10)
浠g爜鐪嬭搗鏉ヤ技涔庢湁鐐歸毦鐪嬩簡錛屾渶閲嶈鐨勬槸瀹冧笉鏄撶紪鍐欙紝絳栧垝浼拌浼氭姄鐙傜殑銆傛垜鎯籌紝瀵逛簬闈炰笓涓氱▼搴忓憳鑰岃█錛岀▼搴忕殑
欏哄簭鎵ц鍙兘鐞嗚В璧鋒潵鏇翠負瀹規槗銆?
SOLVE IT
鎴戜滑鐨勮В鍐蟲柟妗堬紝鍏跺疄鍙湁涓鍙ヨ瘽錛氬綋鑴氭湰鎵ц鍒伴樆濉炴搷浣滄椂錛堝NPCDialog錛夛紝鎸傝搗鑴氭湰錛屽綋瀹夸富紼嬪簭鏌愪釜鎿嶄綔瀹?br>鎴愭椂錛岃鑴氭湰浠庝箣鍓嶇殑鎸傝搗鐐圭戶緇墽琛屻?br> 榪欎笉鏄竴縐嶅亣鎯崇殑鍔熻兘銆傛垜鍦ㄥ垰寮濮嬪疄鐜拌繖涓姛鑳戒箣鍓嶏紝浠ヤ負LUA涓嶆敮鎸佽繖涓姛鑳姐傛垜鑷嗘兂鐫濡備笅鐨勬搷浣滐細
鑴氭湰錛?br> ret = NPCDialog("Hello bitch")
if ret == 0 then print("OK") end
瀹夸富紼嬪簭錛?br>
static int do_npc_dialog( lua_State *L )
{

lua_suspend_script( L );

}
鏌愪釜鍦版柟鏌愪釜鎿嶄綔瀹屾垚浜嗭細
lua_resume_script( L );
褰撴垜瀹炵幇浜嗚繖涓姛鑳藉悗錛屾垜鐚涚劧鍙戠幇錛屽疄闄呮儏鍐靛拰鎴戣繖閲屾兂鐨勫樊涓嶅錛堟湁鐐規睏棰滐級銆?/font>
璁よ瘑Coroutine
coroutine鏄疞UA涓被浼肩嚎紼嬬殑涓滆タ錛屼絾鏄畠鍏跺疄鍜宖iber鏇寸浉浼箋備篃灝辨槸璇達紝瀹冩槸涓縐嶉潪鎶㈠崰寮忕殑綰跨▼錛屽畠鐨勫垏鎹㈠彇鍐?br>浜庝換鍔℃湰韜紝涔熷氨鏄彇鍐充綘錛屼綘鍐沖畾瀹冧滑浠涔堟椂鍊欏彂鐢熷垏鎹€傚緩璁綘闃呰lua manual浜嗚В鏇村銆?br> coroutine鏀寔鐨勫吀鍨嬫搷浣滄湁錛歭ua_yield, lua_resume錛屼篃灝辨槸鎴戜滑闇瑕佺殑鎸傝搗鍜岀戶緇墽琛屻?br> lua_State浼間箮灝辨槸涓涓猚oroutine錛屾垨鑰呮寜鐓UA鏂囨。涓殑鍙︿竴縐嶈娉曪紝灝辨槸涓涓猼hread銆傛垜榪欓噷涔嬫墍浠ョ敤’浼間箮‘鏄?br>鍥犱負鎴戣嚜宸變篃鏃犳硶紜畾錛屾垜鍙兘璇達紝lua_State鐪嬭搗鏉ュ氨鏄竴涓猚oroutine銆?br> LUA鎻愪緵lua_newthread鐢ㄤ簬鎵嬪伐鍒涘緩涓涓猚oroutine錛岀劧鍚庡皢鏂板垱寤虹殑coroutine鏀劇疆浜庡爢鏍堥《錛屽鍚屽叾浠杗ew鍑烘潵鐨?br>瀵硅薄涓鏍楓傜綉涓婃湁甯栧瓙璇磍ua_newthread鍒涘緩鐨勪笢瑗夸笌鑴氭湰閲岃皟鐢╟oroutine.create鍒涘緩鍑烘潵鐨勪笢瑗夸笉涓鏍鳳紝浣嗘槸鏍規嵁鎴?br>鐨勮瀵熸潵鐪嬶紝浠栦滑鏄竴鏍風殑銆俵ua_newthread榪斿洖涓涓猯ua_State瀵硅薄錛屾墍浠ヤ粠榪欓噷鍙互鐪嬪嚭錛?#8220;lua_State鐪嬭搗鏉ュ氨鏄竴涓?br>coroutine”銆傚彟澶栵紝緗戜笂涔熸湁浜鴻鍒涘緩鏂扮殑coroutine浠d環寰堝ぇ錛屼絾鏄紝涓涓猯ua_State鐨勪唬浠瘋兘鏈夊澶э紵褰撶劧錛屾垜娌″仛榪?br>嫻嬭瘯錛屼笉鏁㈠璦銆?br> lua_yield鐢ㄤ簬鎸傝搗涓涓猚oroutine錛屼笉榪囪鍑芥暟鍙兘鐢ㄤ簬coroutine鍐呴儴錛岀湅鐪嬪畠鐨勫弬鏁板氨鐭ラ亾浜嗐?br> lua_resume鐢ㄤ簬鍚姩涓涓猚oroutine錛屽畠鍙互鐢ㄤ簬coroutine娌℃湁榪愯鏃跺惎鍔ㄤ箣錛屼篃鍙互鐢ㄤ簬coroutine鎸傝搗鏃墮噸鏂板惎鍔?br>涔嬨俵ua_resume鍦ㄤ袱縐嶆儏鍐典笅榪斿洖錛歝oroutine鎸傝搗鎴栬呮墽琛屽畬姣曪紝鍚﹀垯lua_resume涓嶈繑鍥炪?br> lua_yield鍜宭ua_resume瀵瑰簲浜庤剼鏈嚱鏁幫細coroutine.yield鍜宑oroutine.resume錛屽緩璁綘鍐欏啓鑴氭湰紼嬪簭鎰熷彈涓媍oroutine錛?br>渚嬪錛?br>
function main()
print("main start")
coroutine.yield()
print("main end")
end
co=coroutine.create( main );
coroutine.resume(co)
REALLY SOLVE IT
浣犲彲鑳戒細鎯沖埌錛屾垜浠負鑴氭湰瀹氫箟涓涓猰ain錛岀劧鍚庡湪瀹夸富紼嬪簭閲宭ua_newthread鍒涘緩涓涓猚oroutine錛岀劧鍚庡皢main鏀捐繘鍘伙紝
褰撹剼鏈皟鐢ㄥ涓葷▼搴忕殑鏌愪釜’闃誨‘鎿嶄綔鏃訛紝瀹夸富紼嬪簭鑾峰彇鍒頒箣鍓嶅垱寤虹殑coroutine錛岀劧鍚巠ield涔嬨傚綋鎿嶄綔瀹屾垚鏃訛紝鍐峳esume
涔嬨?br> 浜嬪疄涓婃柟娉曟槸瀵圭殑錛屼絾鏄病鏈夊繀瑕佸啀鍒涘緩涓涓猚oroutine銆傚涔嬪墠鎵璇達紝涓涓猯ua_State鐪嬩笂鍘誨氨鏄竴涓猚oroutine錛?br>鑰屾伆濂斤紝鎴戜滑濮嬬粓閮戒細鏈変竴涓猯ua_State銆傛劅瑙変笂錛岃繖涓猯ua_State灝卞儚鏄痬ain coroutine銆傦紙灝卞儚浣犵殑涓葷嚎紼嬶級
鎬濊礬灝辨槸榪欐牱錛屽洜涓哄叿浣撳疄鐜版椂錛岃繕鏄湁浜涢棶棰橈紝鎵浠ユ垜緗楀垪姣忎釜姝ラ鐨勪唬鐮併?br> 鍒濆lua_State鏃跺浣犲鉤鏃舵墍鍋氾細
lua_State *L = lua_open();
luaopen_base( L );
娉ㄥ唽鑴氭湰闇瑕佺殑瀹夸富紼嬪簭鍑芥暟鍒癓閲岋細
lua_pushcfunction( L, sleep );
lua_setglobal( L, "my_sleep" );
杞藉叆鑴氭湰鏂囦歡騫舵墽琛屾椂紼嶅井鏈夌偣涓嶅悓錛?br>
luaL_loadfile( L, "test.lua" );
lua_resume( L, 0 ); /**//* 璋冪敤resume */
鍦ㄤ綘鐨?#8217;闃誨‘鍑芥暟閲岄渶瑕佹寕璧穋oroutine錛?br>
return lua_yield( L, 0 );
娉ㄦ剰錛宭ua_yield鍑芥暟闈炲父鐗瑰埆錛屽畠蹇呴』浣滀負return璇彞琚皟鐢紝鍚﹀垯浼氳皟鐢ㄥけ璐ワ紝鍏蜂綋鍘熷洜鎴戜篃涓嶆竻妤氥傝屽湪榪欓噷錛?br>瀹冧綔涓簂ua_CFunction鐨勮繑鍥炲鹼紝浼氫笉浼氬紩鍙戦敊璇紵鍥犱負lua_CFunction綰﹀畾榪斿洖鍊間負璇ュ嚱鏁板浜庤剼鏈岃█鐨勮繑鍥炲間釜鏁般?br>瀹為檯鎯呭喌鏄紝鎴戠湅鍒扮殑涓浜涗緥瀛愰噷閮借繖鏍峰畨鎺抣ua_yield錛屾墍浠 do what they do銆?
鍦ㄨ繖涓搷浣滃畬鎴愬悗錛堝鐜╁鎿嶄綔浜嗛偅涓璇濇錛夛紝瀹夸富紼嬪簭闇瑕佸敜閱抍oroutine錛?br>
lua_resume( L, 0 );
澶ц嚧姝ラ灝辮繖浜涖傚鏋滀綘瑕佸崟鐙垱寤烘柊鐨刲ua_State錛屽弽鑰屼細鎼炲緱寰堥夯鐑︼紝鎴戝紑濮嬪氨鏄偅鏍風殑鍋氱殑錛屾繪槸瀹炵幇涓嶄簡鑷繁
棰勬兂涓殑鏁堟灉銆?
鐩稿叧涓嬭澆錛?/strong>
渚嬪瓙紼嬪簭涓紝鎴戠粰浜嗕竴涓猻leep瀹炵幇銆傝剼鏈▼搴忚皟鐢╯leep鏃跺皢琚寕璧鳳紝瀹夸富紼嬪簭涓嶆柇媯鏌ュ綋鍓嶆椂闂達紝褰撴椂闂村埌鏃訛紝resume
鎸傝搗鐨刢oroutine銆?a href="http://www.shnenglu.com/Files/kevinlynx/lua_test_coro.rar" target=_blank>涓嬭澆渚嬪瓙
8.13琛ュ厖
鍙兘鏈夋椂鍊欙紝鎴戜滑鎻愪緵緇欒剼鏈殑鍑芥暟闇瑕佽繑鍥炰竴浜涘肩粰鑴氭湰錛屼緥濡侼PCDialog榪斿洖鎿嶄綔緇撴灉錛屾垜浠彧闇瑕佸湪瀹夸富紼嬪簭閲宭ua_resume
涔嬪墠push榪斿洖鍊煎嵆鍙紝褰撶劧錛岄渶瑕佽緗甽ua_resume絎簩涓弬鏁頒負榪斿洖鍊間釜鏁般?br>
2.9.2010
lua_yield( L, nResults )絎簩涓弬鏁版寚瀹氳繑鍥炵粰lua_resume鐨勫間釜鏁般傚涓嬶細
lua_pushnumber( L, 3 );
return lua_yield( L, 1 );



..
int ret = lua_resume( L, 0 );
if( ret == LUA_YIELD )
{
lua_Number r = luaL_checknumber( L, -1 );
}