@egor230

Как в lua api c++, приостановить выполнение функции через определенное время?

Здравствуйте, уважаемые программисты.
Есть вопрос как в 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;
};
  • Вопрос задан
  • 18 просмотров
Пригласить эксперта
Ответы на вопрос 1
@egor230 Автор вопроса
так решил
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;
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы