Здравствуйте, уважаемые программисты. Есть вопрос как в lua api c++, приостановить выполнение функции через определенное время.
Обычно приостановление функций, если lua_resume вернула yield.
Как тут для примера.
Код
int my_yield(lua_State* L) {
return lua_yield(L, 0);
};
const char* LUA = R"(
function foo()
print(" func foo \n")
end
function main()
for i = 1, 3 do
print(" func main "..i.."\n")
my_yield()
end end
)";
int main(int argc, char* argv[]) {
lua_State* L = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/
luaL_openlibs(L);
lua_State* L1 = lua_newthread(L);
cout << "\n";
lua_register(L, "my_yield", my_yield);
checkerror(L, LUA);
lua_getglobal(L, "main");
while (true) {
int ret = lua_resume(L, L1, 0);
if (ret == LUA_YIELD) {
lua_getglobal(L1, "foo");
lua_pcall(L1, 0, 0, 0);
}
else if (ret == 0) {
break;
}
};
lua_close(L);
return 0;
};
Функция main вызывает функцию my_yield и функция main приостановиться уступая функции foo.
Как это сделать без вызова функции my_yield?
Код
int my_yield(lua_State* L) {
this_thread::sleep_for(chrono::milliseconds(306));// задержка
return lua_yield(L, 0);
};
const char* LUA = R"(
function foo()
print(" func foo \n")
end
function main()
while true do
print(" main \n")
end end
)";
int main(int argc, char* argv[]) {
lua_State* L = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/
luaL_openlibs(L);
lua_State* L1 = lua_newthread(L);
checkerror(L, LUA);
lua_getglobal(L, "main");// получить функцию.
while (true) {
thread th(my_yield, std::ref(L)); //th.detach();// независимый поток.
int ret = lua_resume(L, L1, 0);
cout << ret << endl;
if (ret == LUA_YIELD) {
lua_getglobal(L1, "foo");
lua_pcall(L1, 0, 0, 0);
break;
}
else if (ret == 0) {/*Когда функция lua_resume возвращается, стек содержит все значения,
переданные в lua_yield, или все значения, возвращенные телом функции.*/
}
};
lua_close(L);
return 0;
};
Здравствуйте уважаемые программисты. Пишу скрипты на языке lua в ide IntelliJ IDEA. Она очень похожа на pycharm для python. Всё нравится, но есть один ньюанс, когда я пишу pri, нажимаю enter код автодополняется на print, а мне нужен print() Как сделать чтобы автоматическом добавлялись 2 круглые скобки в конце функции. Подскажите, пожалуйста.
Спасибо большое за ссылку Уважаемый Николай. Долго ломал голову, Как сделать правильное наследования от класса. Получилось так. car = {} --создадим "класс" автомобиль function car:set(model) --инициализируем поля класса local obj = {} obj.model = model setmetatable(obj,self) self.__index = self --перед return obj -- возвращаем объект! end function car:get(obj) return self.model end moto = {} -- класс мото function moto:pet() --переназначение метода return "new" end setmetatable(moto,{__index = car}) --наследуемся m = moto:set("VAZ") --меняем название print(m:get()) -->мы увидим VAZ print(m:pet()) --> new
Теперь интересует Как избавиться от двоеточие при объявление экземпляра класса?. Помню как-то достигал. вот здесь local car = {} -- Прежде чем создавать экземпляры объекта, необходимо описать соответствующий ему класс. car.__index = car --__index содержит указатель на сам класс. Это нужно будет для правильной работы оператора self function car.set(model, color) --Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения. local self = setmetatable({}, car) --Переопределяет метатаблицу вновь созданного объекта, в результате чего объект получает доступ к методам класса. Методов пока нет, но они будут описаны позже. self.color = color self.model = model return self end function car.get_color(self) z = self.color return z end function car.get_model(self) z = self.model return z end local i = car.set("kia","black") -- ставим точку print(i:get_model())
Подскажите пожалуйста, как наследовать класс? Не получается выдаёт ошибку
Код
local car = {} -- Прежде чем создавать экземпляры объекта, необходимо описать соответствующий ему класс.
car.__index = car --__index содержит указатель на сам класс. Это нужно будет для правильной работы оператора self
function car:set(model, color) --инициализируем поля класса
local self = setmetatable({},car) --далее идет превращение таблицы в "класс", объяснять не буду, т.к для этого нужна отдельная статья
self.model = model --
self.color = color --
return self
end
function car:get() --функция получения результата
return self.model, self.color
end
moto = {} -- инициализируем класс мото
function moto:pet() --переназначение метода
return "new"
end
setmetatable(moto,{__index = car}) --наследуемся
m = moto.set("URAL","BLUE") --меняем название и цвет
print(m:get()) -->мы увидим 2000 year
print(m:pet()) --> URAL BLUE