THE ORB
Studio wird gestartet

Versuch, über eine C-Aufrufgrenze zu yielden

Ein Script wollte an einer Stelle warten, an der Warten nicht erlaubt ist. Ein Programmierfehler, kein Einrichtungsfehler.

groupsDiese Funktion hört auf zu funktionierencodeBraucht einen Entwickler

Mach das zuerst

Das braucht eine Codeänderung in dem Script — der Autor oder ein Entwickler muss den wartenden Teil verschieben.

bug_reportFüg lieber deine ganze Konsole ein

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. 1

    Ein Wait oder await in einem table.sort-Vergleicher

    table.sort ist nativ. Alles, was der Vergleicher tut, muss sofort zurückkehren.

  2. 2

    In einer Ersetzungsfunktion von string.gsub warten

    Ebenfalls nativ.

  3. 3

    In einem NUI-Callback warten

    RegisterNUICallback-Handler müssen cb() aufrufen und zurückkehren; darin auf eine Abfrage zu warten läuft in manchen Builds genau hier auf.

  4. 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. 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 öffnen

Für diese Art Fehler Script Optimizer liest das Script und repariert den Code dahinter.

Fehler, die mit diesem zusammen auftreten