Versuch, über eine C-Aufrufgrenze zu yielden
Ein Script wollte an einer Stelle warten, an der Warten nicht erlaubt ist. Ein Programmierfehler, kein Einrichtungsfehler.
Mach das zuerst
Das braucht eine Codeänderung in dem Script — der Autor oder ein Entwickler muss den wartenden Teil verschieben.
Was es bedeutet
Der Code wollte an einer Stelle warten, die sich nicht anhalten lässt. Lua kann nur seine eigenen Rahmen aussetzen; führt die Aufrufkette gerade durch nativen (C++-)Code, gibt es nichts auszusetzen — das Warten ist also unzulässig.
Was es auslöst
Sortiert danach, wie oft es die Antwort ist.
- 1
Ein Wait oder await in einem table.sort-Vergleicher
table.sortist nativ. Alles, was der Vergleicher tut, muss sofort zurückkehren. - 2
In einer Ersetzungsfunktion von string.gsub warten
Ebenfalls nativ.
- 3
In einem NUI-Callback warten
RegisterNUICallback-Handler müssencb()aufrufen und zurückkehren; darin auf eine Abfrage zu warten läuft in manchen Builds genau hier auf. - 4
In einem älteren Lua innerhalb von pcall warten
Lua 5.4 erlaubt das Abgeben durch pcall hindurch, ältere Runtimes und manche nativen Wrapper nicht.
- 5
In einem State-Bag-Änderungshandler warten
Die werden von der nativen Schicht aufgerufen.
Wie du erkennst, welcher deiner ist
Die Spur nennt den nativen Rahmen. Stell der fehlschlagenden Zeile eine einfachere Frage: Steht sie in einer Funktion, die ich an etwas anderes übergeben habe? Wenn ja, ist dort die Grenze.
Wo du nachsehen musst
Die als Argument übergebene Funktion in der fehlschlagenden Zeile oder darüber.
Wie du es behebst
Warte außerhalb und halte den Callback synchron:
-- falsch
RegisterNUICallback('buy', function(data, cb)
local rows = MySQL.query.await('SELECT ...') -- Grenze
cb(rows)
end)
-- richtig
RegisterNUICallback('buy', function(data, cb)
cb({ ok = true }) -- antworte sofort
CreateThread(function() -- und mach dann die langsame Arbeit
local rows = MySQL.query.await('SELECT ...')
SendNUIMessage({ action = 'result', rows = rows })
end)
end)Hängst du immer noch an deinem eigenen Code?
Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.
bug_reportServer Fixer öffnenFür diese Art Fehler Script Optimizer liest das Script und repariert den Code dahinter.