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.
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.
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
Un Wait ou un await dans un comparateur de table.sort
table.sortest natif. Tout ce que fait le comparateur doit revenir immédiatement. - 2
Attendre dans une fonction de remplacement de string.gsub
Également natif.
- 3
Attendre dans un callback NUI
Les gestionnaires
RegisterNUICallbackdoivent appelercb()et revenir ; attendre une requête à l'intérieur se heurte à ceci sur certains builds. - 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
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 FixerPour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.