copas crash.

meowprd

Тот самый Котовский
Автор темы
Проверенный
1,278
718
Версия MoonLoader
.026-beta
Код:
[ML] (error) SCRIPT_NAME: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'resume'
    D:\Games\okolo stok gta\moonloader\lib\copas.lua:560: in function '_doTick'
    D:\Games\okolo stok gta\moonloader\lib\copas.lua:638: in function 'addthread'
    D:\Games\okolo stok gta\moonloader\SCRIPT_NAME.lua:754: in function 'httpRequest'
    D:\Games\okolo stok gta\moonloader\SCRIPT_NAME.lua:876: in function <D:\Games\okolo stok gta\moonloader\SCRIPT_NAME.lua:872>
[ML] (error) SCRIPT_NAME: Script died due to an error. (1CA52E04)

Lua:
local response, code, headers, status = httpRequest("https://brightside.loc/get.php?"..httpBuildQuery(params)) -- 876

Lua:
local function httpRequest(request, body, handler) -- copas.http
    -- start polling task
    if not copas.running then
        copas.running = true
        lua_thread.create(function()
            wait(0)
            while not copas.finished() do
                local ok, err = copas.step(0)
                if ok == nil then error(err) end
                wait(0)
            end
            copas.running = false
        end)
    end
    -- do request
    if handler then
        return copas.addthread(function(r, b, h)
            copas.setErrorHandler(function(err) h(nil, err) end)
            h(http.request(r, b))
        end, request, body, handler)
    else
        local results
        local thread = copas.addthread(function(r, b) -- 754
            copas.setErrorHandler(function(err) results = {nil, err} end)
            results = table.pack(http.request(r, b))
        end, request, body)
        while coroutine.status(thread) ~= 'dead' do wait(0) end
        return table.unpack(results)
    end
end

httpRequest вызывается внутри отдельного потока в бесконечном цикле с задержкой 2500
Полный код показывать не буду, там куча проверок, накидаю пример:
Lua:
lua_thread.create(function()
    while true do
        local response, code, header, status = httpRequest()
        if response then
            -- Куча проверок на нужный контент внутри response
        end
        wait(2500)
    end
end)

Если условия хотя бы одной проверки выполняются - то делаю break.
Дальнейший код производит нужные махинации.

Изначально все отлично отправляется, ответ приходит, проверки работают, но потом при очередном запросе (при этом несколько запросов до этого успешно выполняется) происходит ошибка.
Lua:
[19:40:54.289096] (script)    SCRIPT: send request to server
[19:40:54.602259] (script)    SCRIPT: request succ got
[19:40:57.105325] (script)    SCRIPT: send request to server
[19:40:57.418155] (script)    SCRIPT: request succ got
[19:40:59.923948] (script)    SCRIPT: send request to server
[19:41:00.244120] (script)    SCRIPT: request succ got
[19:41:02.747553] (script)    SCRIPT: send request to server
[19:41:02.752540] (error)    SCRIPT: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'resume'
    D:\Games\okolo stok gta\moonloader\lib\copas.lua:560: in function '_doTick'
    D:\Games\okolo stok gta\moonloader\lib\copas.lua:638: in function 'addthread'
    D:\Games\okolo stok gta\moonloader\SCRIPT.lua:754: in function 'httpRequest'
    D:\Games\okolo stok gta\moonloader\SCRIPT.lua:876: in function <D:\Games\okolo stok gta\moonloader\SCRIPT.lua:872>
[19:41:02.752540] (error)    SCRIPT: Script died due to an error. (1CA52E04)
 

meowprd

Тот самый Котовский
Автор темы
Проверенный
1,278
718

meowprd

Тот самый Котовский
Автор темы
Проверенный
1,278
718
Ну по крайней мере я еще не видел не одного универсального, да и вообще решения ошибки "cannot resume non-suspended coroutine"
Вообще сама суть ошибки заключается в неправильном использовании потока.

До этого я тестил тот же цикл в отдельном потоке, при этом не запуская остальные потоки и оно спокойно проработало 10 минут (при этом задержка была уменьшена до 500 вроде)
Но когда же я запускаю еще один основной поток скрипта, который и вызывает все нужные ему функции (в которых содержатся потоки), то тогда начинает происходить такой прикол.
Но такое может произойти спокойно и без потока, когда я запускаю httpRequest при остановленных других потоках.

Звучит сложно, но по итогу получается:
Я запускаю основной поток в котором вызываю функцию, которая запускает еще один поток с бесконечным циклом в котором отсылается запрос.
 

BARRY BRADLEY

Известный
711
176
Используй запросы через effil, в теме асинхронных запросов он есть. Использую уже больше года, все работает без крашей

 

meowprd

Тот самый Котовский
Автор темы
Проверенный
1,278
718
Нормальный способ?
 

BARRY BRADLEY

Известный
711
176

Fott

Простреленный
3,461
2,374
Использую больше года в скрипте с кучей запросов. Ошибок таких не наблюдал ни разу.
Если производить постоянный вызов(без задержки) в одном потоке - все ок (За 10 минут). Если создавать несколько потоков с постоянным вызовом, скрипт крашит.
1621700941474.png

Постоянные и частые запросы с effil провернуть не получиться.
 

BARRY BRADLEY

Известный
711
176
Если производить постоянный вызов(без задержки) в одном потоке - все ок (За 10 минут). Если создавать несколько потоков с постоянным вызовом, скрипт крашит.
Посмотреть вложение 98066
Постоянные и частые запросы с effil провернуть не получиться.
Не думаю что есть какой то смысл отправлять каждую миллисекунду запрос