помощь с loadstring()

Статус
В этой теме нельзя размещать новые ответы.

Shishkin

Известный
Автор темы
536
273
как остановить выполнение loadstring() вне его кода?
 
Решение
можно сделать что-то с unload().
типа создавать луашник и в нужный момент его удалять, правда смотрится в теории это ещё костыльней
Ну по твоей теории как-то так будет.
Lua:
local script_text = [[
function main()
	repeat wait(100) until isSampAvailable()
	sampRegisterChatCommand("TestLoads", function() sampAddChatMessage("I'm alive!", -1) end)
	wait(-1)
end
]] -- это для примера. Код можно откуда-то скачать и т.д. и т.п.
local script_path, script_handle = (getWorkingDirectory().."\\__new__.lua"), nil -- объявляем путь и переменную под будущий экземпляр LuaScript

function main()
	repeat wait(100) until isSampAvailable()

	sampRegisterChatCommand("load", function()
		if script_handle ~= nil then unloadScript() end -- если скрипт...

Andrinall

Известный
700
518
как остановить выполнение loadstring() вне его кода?
Могу предложить такой вариант. Под loadstring создавать замороженный поток и когда надо использовать loadstring - запускать этот поток.
Lua:
local code = lua_thread.create_suspended(function()
	loadstring([[
		local iter = 0
		while true do wait(1000)
			print(iter)
			iter = iter + 1
		end
	]])()
end)

function main()
	repeat wait(100) until isSampAvailable()

	sampRegisterChatCommand("runcode", function()
		code:run()
		print("Runned")
	end)
	sampRegisterChatCommand("stopcode", function()
		code:terminate()
		print("Stopped")
	end)

	wait(-1)
end
изображение_2023-03-16_185858763.png
 

Shishkin

Известный
Автор темы
536
273
Могу предложить такой вариант. Под loadstring создавать замороженный поток и когда надо использовать loadstring - запускать этот поток.
Lua:
local code = lua_thread.create_suspended(function()
    loadstring([[
        local iter = 0
        while true do wait(1000)
            print(iter)
            iter = iter + 1
        end
    ]])()
end)

function main()
    repeat wait(100) until isSampAvailable()

    sampRegisterChatCommand("runcode", function()
        code:run()
        print("Runned")
    end)
    sampRegisterChatCommand("stopcode", function()
        code:terminate()
        print("Stopped")
    end)

    wait(-1)
end
Посмотреть вложение 193825
Как по мне как-то костыльно.
К тому-же тогда мы ограничиваем функционал loadstring (в нем нельзя будет создавать потоки, иначе краш).
 

Andrinall

Известный
700
518
Как по мне как-то костыльно.
К тому-же тогда мы ограничиваем функционал loadstring (в нем нельзя будет создавать потоки, иначе краш).
Ну, других способов принудительно остановить код не из самого кода я что-то не припомню. Может я чего не знаю)

И, кстати, краша не будет. Просто не будет прерываться выполнение потока созданного внутри loadstring
изображение_2023-03-16_200202611.png


И ещё заметил, что потоки по сути и не нужны будут.
Внутри потока спокойно можно юзать wait в любых функциях внутри loadstring
Lua:
local code = lua_thread.create_suspended(function()
	loadstring([[
		local iter = 0
		local function changeIter()
		    wait(1000)
		    iter = iter + 1
		end

		while true do wait(1000)
		    print(iter)
		    changeIter()
		end
	]])()
end)

function main()
	repeat wait(100) until isSampAvailable()

	sampRegisterChatCommand("runcode", function()
		code:run()
		print("Runned")
	end)
	sampRegisterChatCommand("stopcode", function()
		code:terminate()
		print("Stopped")
	end)

	wait(-1)
end
 

Shishkin

Известный
Автор темы
536
273
Ну, других способов принудительно остановить код не из самого кода я что-то не припомню. Может я чего не знаю)

И, кстати, краша не будет. Просто не будет прерываться выполнение потока созданного внутри loadstring
Посмотреть вложение 193842

И ещё заметил, что потоки по сути и не нужны будут.
Внутри потока спокойно можно юзать wait в любых функциях внутри loadstring
Lua:
local code = lua_thread.create_suspended(function()
    loadstring([[
        local iter = 0
        local function changeIter()
            wait(1000)
            iter = iter + 1
        end

        while true do wait(1000)
            print(iter)
            changeIter()
        end
    ]])()
end)

function main()
    repeat wait(100) until isSampAvailable()

    sampRegisterChatCommand("runcode", function()
        code:run()
        print("Runned")
    end)
    sampRegisterChatCommand("stopcode", function()
        code:terminate()
        print("Stopped")
    end)

    wait(-1)
end
можно сделать что-то с unload().
типа создавать луашник и в нужный момент его удалять, правда смотрится в теории это ещё костыльней
 
  • Нравится
Реакции: Andrinall

Andrinall

Известный
700
518
можно сделать что-то с unload().
типа создавать луашник и в нужный момент его удалять, правда смотрится в теории это ещё костыльней
Ну по твоей теории как-то так будет.
Lua:
local script_text = [[
function main()
	repeat wait(100) until isSampAvailable()
	sampRegisterChatCommand("TestLoads", function() sampAddChatMessage("I'm alive!", -1) end)
	wait(-1)
end
]] -- это для примера. Код можно откуда-то скачать и т.д. и т.п.
local script_path, script_handle = (getWorkingDirectory().."\\__new__.lua"), nil -- объявляем путь и переменную под будущий экземпляр LuaScript

function main()
	repeat wait(100) until isSampAvailable()

	sampRegisterChatCommand("load", function()
		if script_handle ~= nil then unloadScript() end -- если скрипт уже загружен - выгружаем и загружаем заного(аля релоад выйдет)
        -- можно поставить return чтобы не загружать снова, а только выгрузить, либо можно реально сделать script_handle:reload()

        -- записываем скрипт в файл
		local file = io.open(script_path, "w")
		file:write(script_text)
		file:close()

		script_handle = script.load(script_path) -- грузим скрипт и получаем экземпляр LuaScript, записав в переменную
		os.remove(script_path) -- удаляем файлик(если надо аля скрыть код, хотя это так не работает :D)
	end)

	sampRegisterChatCommand("unload", function()
		if script_handle == nil then return end -- если скрипт не загружен - выходим ничего не делая
		unloadScript()
	end)

	wait(-1)
end

function unloadScript()
	script_handle:unload() -- выгружаем загруженный скрипт
	script_handle = nil
end
изображение_2023-03-16_201654942.png
 
  • Нравится
Реакции: Shishkin
Статус
В этой теме нельзя размещать новые ответы.