E
E
egor2302019-08-15 15:12:33
Lua
egor230, 2019-08-15 15:12:33

How in lua api c++, pause the execution of a function after a certain time?

Hello dear programmers.
There is a question how in lua api c ++, suspend the execution of a function after a certain time.
Normally suspending functions if lua_resume returned yield.
Like here for an example.

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;
};

The main function calls the my_yield function and the main function will pause, yielding to the foo function.
How can I do this without calling the my_yield function?
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;
};

Answer the question

In order to leave comments, you need to log in

2 answer(s)
E
egor230, 2019-08-15
@egor230

decided so

void LUAHook(lua_State* L, lua_Debug* ar){	lua_yield(L, 0);
};

const char* LUA = R"(
function foo()
for i = 1, 6 do
print(" func foo "..i.."\n")
end 
end
function main()
for i = 1, 1300 do
print(" main ", i)  	
   	end
end

)";
int main() {
  lua_State* L = luaL_newstate();	luaL_openlibs(L);
  lua_sethook(L, LUAHook, LUA_MASKCOUNT, 23);	// Добавить подсчет счетчика, который сработает после указания числа
  checkerror(L, LUA);	
  lua_State* L1 = lua_newthread(L);
  int ret, ret1;
  lua_getglobal(L, "main");// функция lua возобновляется с последней прерванной позиции.

  while (true) {
    if (ret = !0) {
      ret = lua_resume(L, L1, 0);
    };

    if (ret == LUA_YIELD || ret1 == LUA_YIELD) {
      lua_getglobal(L1, "foo");
      ret1 = lua_resume(L1, L, 0);
    }
    if (ret == 0) {// Успешно завершение функции.
      break;
    }
  };

return 0;
};

V
Vadim Ushakov, 2021-10-16
@Nightmare1

You can find a way to interpret the code and change the behavior depending on the time.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question