attempt to yield across a C-call boundary
Bir script, beklemenin yasak olduğu bir yerde beklemeye çalıştı. Bu bir kurulum hatası değil, bir kodlama hatası.
Önce şunu yap
Bunun için o script'te bir kod değişikliği gerekiyor — bekleyen kısmı yazarın ya da bir geliştiricinin taşıması lazım.
Ne anlama gelir
Kod, duraklatılamayan bir yerde beklemeye çalıştı. Lua yalnızca kendi çerçevelerini askıya alabilir; çağrı zinciri o anda native (C++) koddan geçiyorsa askıya alınacak bir şey yoktur, o yüzden bekleme yasaktır.
Neden olur
Ne sıklıkla doğru cevap olduğuna göre sıralı.
- 1
table.sort karşılaştırıcısı içinde bir Wait ya da await
table.sortnative'dir. Karşılaştırıcının yaptığı her şey hemen dönmelidir. - 2
string.gsub değiştirme fonksiyonu içinde beklemek
O da native.
- 3
Bir NUI geri çağırması içinde beklemek
RegisterNUICallbackişleyicilericb()çağırıp dönmelidir; içinde bir sorgu beklemek bazı sürümlerde buna çarpar. - 4
Eski Lua'da pcall içinde beklemek
Lua 5.4 pcall üzerinden yield etmeye izin verir, ama daha eski çalışma zamanları ve bazı native sarmalayıcılar vermez.
- 5
Bir state bag değişim işleyicisi içinde beklemek
Onlar native katmandan çağrılır.
Hangisinin seninki olduğu nasıl anlaşılır
Geri iz native çerçeveyi adlandırır. Başarısız olan satıra daha basit bir soru sor: başka bir şeye geçirdiğim bir fonksiyonun içinde mi? Evetse, sınır odur.
Nereye bakmalı
Başarısız olan satırda ya da üstünde argüman olarak geçirilen fonksiyon.
Nasıl düzeltilir
Beklemeyi dışarıda yap, ve geri çağırmayı eşzamanlı tut:
-- yanlış
RegisterNUICallback('buy', function(data, cb)
local rows = MySQL.query.await('SELECT ...') -- sınır
cb(rows)
end)
-- doğru
RegisterNUICallback('buy', function(data, cb)
cb({ ok = true }) -- hemen yanıtla
CreateThread(function() -- sonra yavaş işi yap
local rows = MySQL.query.await('SELECT ...')
SendNUIMessage({ action = 'result', rows = rows })
end)
end)Hâlâ kendi kodunda mı takıldın?
Bu sayfa, bu hatanın genelde ne anlama geldiğini anlatır. Konsolunu Server Fixer'a yapıştır; içindeki her şeyi sıraya dizer ve önce ne yapman gerektiğini söyler. Kendin uğraşmak istemiyorsan ORBIE script'i onarır ve kaynağı sunucuna atmaya hazır geri verir.
bug_reportServer Fixer'ı açBu tür bir hata için Script Optimizer script'i okur ve bunun arkasındaki kodu onarır.