Два параллельных цикла.

yasinitsky

Новичок
Автор темы
9
0
Версия MoonLoader
.026-beta
Всем привет. Появилась необходимость помимо основного цикла обработки событий в функции main добавить еще один цикл, который будет выполняться параллельно, и, чтобы в случае его блокировки (например, при выполнении http-запроса), основной цикл продолжал работу и игра не зависала. Я попытался использовать встроенный в MoonLoader класс для работы к coroutine'ами, но блокировка созданного таким образом цикла так же останавливает основной игровой цикл, соответственно, игра зависает. При регистрации потока вне функции main происходит такая же ситуация. Подскажите, как можно создать абсолютно параллельный, не влияющий на основной цикл игры поток? Заранее спасибо за ответы.

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(0)
    end
end

function send_data_loop()
    while true do
        wait(200)
        -- отправка http-запроса
    end
end
 
Решение
Ничего не изменилось.
Как скажешь.
Lua:
local besk_two = true
local a = 0
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(220)
        print('Первый цикл')
    end
end

function send_data_loop()
    while besk_two do
        wait(200)
        if a < 10 then
            print('Второй цикл')
            a = a + 1
        end
        if a >= 10 then
            print('Второй цикл остановлен')
            break
        end
    end
end
1621433185394.png

Fott

Простреленный
3,434
2,278
Всем привет. Появилась необходимость помимо основного цикла обработки событий в функции main добавить еще один цикл, который будет выполняться параллельно, и, чтобы в случае его блокировки (например, при выполнении http-запроса), основной цикл продолжал работу и игра не зависала. Я попытался использовать встроенный в MoonLoader класс для работы к coroutine'ами, но блокировка созданного таким образом цикла так же останавливает основной игровой цикл, соответственно, игра зависает. При регистрации потока вне функции main происходит такая же ситуация. Подскажите, как можно создать абсолютно параллельный, не влияющий на основной цикл игры поток? Заранее спасибо за ответы.

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(0)
    end
end

function send_data_loop()
    while true do
        wait(200)
        -- отправка http-запроса
    end
end
Lua:
local besk_two = true

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(0)
    end
end

function send_data_loop()
    while besk_two do
        wait(200)
        -- отправка http-запроса
    end
end
 

yasinitsky

Новичок
Автор темы
9
0
Lua:
local besk_two = true

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(0)
    end
end

function send_data_loop()
    while besk_two do
        wait(200)
        -- отправка http-запроса
    end
end
Ничего не изменилось.
 

Fott

Простреленный
3,434
2,278
Ничего не изменилось.
Как скажешь.
Lua:
local besk_two = true
local a = 0
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(220)
        print('Первый цикл')
    end
end

function send_data_loop()
    while besk_two do
        wait(200)
        if a < 10 then
            print('Второй цикл')
            a = a + 1
        end
        if a >= 10 then
            print('Второй цикл остановлен')
            break
        end
    end
end
1621433185394.png
 

yasinitsky

Новичок
Автор темы
9
0
Как скажешь.
Lua:
local besk_two = true
local a = 0
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    lua_thread.create(send_data_loop);
    while true do
        wait(220)
        print('Первый цикл')
    end
end

function send_data_loop()
    while besk_two do
        wait(200)
        if a < 10 then
            print('Второй цикл')
            a = a + 1
        end
        if a >= 10 then
            print('Второй цикл остановлен')
            break
        end
    end
end
Посмотреть вложение 97723
print - это функция, которая блокирует ввод-вывод на крайне малое количество времени. Если во второй цикл вставить "более блокирующее" действие (например, создать сокет и ожидать подключение), игра все так же зависнет.
 

Fott

Простреленный
3,434
2,278
print - это функция, которая блокирует ввод-вывод на крайне малое количество времени.
print это функция которая выводит текст в консоль сф. А цикл останавливается при помощи break. То, что у тебя запрос фризит игру - не проблема цикла.

upd:
(например, создать сокет и ожидать подключение), игра все так же зависнет.
Асинхронный запрос через сокеты не фризит игру.