THE ORB
Démarrage du studio

tentative de yield à travers une frontière d'appel C

Un script a tenté d'attendre à un endroit où c'est interdit. C'est une erreur de programmation, pas de configuration.

groupsCette fonctionnalité cesse de marchercodeIl faut un développeur

Faites d'abord ceci

Cela demande un changement de code dans ce script : l'auteur ou un développeur doit déplacer la partie qui attend.

bug_reportCollez plutôt toute votre console

Ce que ça veut dire

Le code a tenté d'attendre à un endroit qui ne peut pas être mis en pause. Lua ne peut suspendre que ses propres cadres ; quand la chaîne d'appels passe à ce moment par du code natif (C++), il n'y a rien à suspendre, donc l'attente est illégale.

Ce qui la provoque

Classé par fréquence : la cause la plus probable en premier.

  1. 1

    Un Wait ou un await dans un comparateur de table.sort

    table.sort est natif. Tout ce que fait le comparateur doit revenir immédiatement.

  2. 2

    Attendre dans une fonction de remplacement de string.gsub

    Également natif.

  3. 3

    Attendre dans un callback NUI

    Les gestionnaires RegisterNUICallback doivent appeler cb() et revenir ; attendre une requête à l'intérieur se heurte à ceci sur certains builds.

  4. 4

    Attendre dans pcall sur un Lua plus ancien

    Lua 5.4 permet de rendre la main à travers pcall, mais les runtimes plus anciens et certains enrobages natifs non.

  5. 5

    Attendre dans un gestionnaire de changement de state bag

    Ceux-là sont invoqués depuis la couche native.

Comment savoir laquelle est la vôtre

La trace nomme le cadre natif. Posez une question plus simple à la ligne fautive : est-elle dans une fonction que j'ai passée à autre chose ? Si oui, c'est là la frontière.

Où regarder

La fonction passée en argument sur la ligne fautive ou au-dessus.

Comment la corriger

Faites l'attente à l'extérieur, et gardez le callback synchrone :

-- faux
RegisterNUICallback('buy', function(data, cb)
    local rows = MySQL.query.await('SELECT ...')   -- frontière
    cb(rows)
end)

-- correct
RegisterNUICallback('buy', function(data, cb)
    cb({ ok = true })                 -- répondez tout de suite
    CreateThread(function()           -- puis faites le travail lent
        local rows = MySQL.query.await('SELECT ...')
        SendNUIMessage({ action = 'result', rows = rows })
    end)
end)

Toujours bloqué sur votre propre code ?

Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.

bug_reportOuvrir le Server Fixer

Pour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.

Les erreurs qui voyagent avec celle-ci