![](/img/trans.png)
[英]Can lua_status detect if a function yields after being called using lua_call?
[英]Using lua_call a lot of times in c++ function
首先,我很抱歉我的英語。
我的問題是如何在C ++函數中多次使用lua_call。 我有一個程序使用lua作為主要語言,但它接受c ++插件來添加功能。 我想從c ++調用LUA函數,並在LUA Runtime中調用該c ++函數。 我想在工作時編寫一個帶有進度的c ++函數,然后將此進程傳遞給LUA函數,該函數負責向用戶顯示進度。
現在我在LUA中有一個測試功能:
function ShowText(text)
Dialog.Message("Hi", text);
return true;
end
和一個c ++函數:
static int Test(lua_State *L){
lua_pushstring(L, "Hi There");
lua_call(L, 1, 1);
lua_pushstring(L, "Again");
lua_call(L, 1, 1);
return 0;
}
然后我使用以下命令從LUA調用此函數:
Test.Test(ShowText);
所有工作都可以正常使用第一個lua_call但是然后清除LUA堆,函數dissapear和第二個lua_call嘗試使用第一個調用的返回布爾值而不是函數。
我想要這樣的東西:
static int Test(lua_State *L){
int total = 10;
for (int j; j<total; j++){
lua_pushnumber(L, j);
lua_pushnumber(L, j);
lua_call(L, 2, 1);
bool continue = IRLUA_PLUGIN_CheckBoolean(L, -1);
lua_pop(L, 1); //Delete the last boolean
if (continue == false){
break;
}
}
return 0;
}
在LUA:
function ShowProgress(actual, final)
local percent = (actual/final)*100;
Dialog.Message("Working", "I'm in "..actual.." from "..final.." ("..percent.."%)");
return true;
end
筆記:
Dialog.Message是我用來顯示消息的程序的一個功能。 就像MessageBox(NULL,Text,Title,MB_OK); 在c ++中。
IRLUA_PLUGIN_CheckBoolean是插件SDK的一個函數,它檢查參數是否為booleand並返回其值,否則返回錯誤。
我可以用lua_getfield(L,LUA_GLOBALSINDEX,“FunctionName”)來做到這一點; ,但不是我想要的。
有人知道怎么做嗎?
你已經很好地理解了這個問題。 這是你如何解決它。
在第一個示例中, lua_call
從堆棧中彈出函數,因此您需要先復制它。 此外,函數返回的布爾值是無用的,因此您需要彈出它或者不要通過將最后一個參數設置為0來要求它為lua_call:
static int Test(lua_State *L) {
lua_pushvalue(L, 1); /* duplicate function */
lua_pushstring(L, "Hi There");
lua_call(L, 1, 0);
lua_pushstring(L, "Again");
lua_call(L, 1, 0);
return 0;
}
現在將其應用於您的第二個示例:
static int Test(lua_State *L) {
int total = 10;
for (int j = 0; j<total; j++) {
lua_pushvalue(L, 1); /* duplicate function */
lua_pushnumber(L, j);
lua_pushnumber(L, total);
lua_call(L, 2, 1);
bool keep_going = IRLUA_PLUGIN_CheckBoolean(L, -1);
lua_pop(L, 1); /* pop the boolean */
if (keep_going == false) {
break;
}
}
return 0;
}
(我已經修復了你的代碼的一些其他問題:傳遞的第二個數字應該是total
,而不是j
,你不想使用continue
作為變量名......)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.