2009-04-06 6 views
0

In einer C-Funktion, die von meinem Lua-Skript aufgerufen wird, verwende ich luaL_ref, um einen Verweis auf eine Funktion zu speichern. Wenn ich dann versuche, den zurückgegebenen Integer-Index zu verwenden, um diese Funktion von einem anderen Thread abzurufen, der nicht vom selben Status abgeleitet ist, bekomme ich nur nil zurück. Hier ist das einfachste Beispiel, das es zu zeigen scheint:Lua Registrierung nicht sichtbar von neuen Zuständen

// Assumes a valid lua_State pL, with a function on top of the stack 
int nFunctionRef = luaL_ref(pL, LUA_REGISTRYINDEX); 

// Create a new state 
lua_State* pL2 = luaL_newstate(); 
lua_rawgeti(pL2, LUA_REGISTRYINDEX, nFunctionRef); 
const char* szType = luaL_typename(pL2, -1); 

Ich finde, dass szType enthält dann den Wert ‚Null‘.

Mein Verständnis war, dass die Registrierung global zwischen allen C-Code geteilt wurde, so kann jeder erklären, warum das nicht funktioniert?

Wenn die Registrierung auf diese Weise nicht global freigegeben ist, wie kann ich auf meine Werte zugreifen, die ich von einem anderen Skript benötige?

+0

Das Registrierungskennzeichen wurde entfernt, da es offensichtlich auf die Windows-Registrierung verweist. – akauppi

Antwort

6

Die Registrierung ist nur eine normale Tabelle in einem Lua-Zustand, daher können zwei unabhängige Lua-Staaten nicht auf die gleiche Registrierung zugreifen.

Wie Kknd sagt, müssen Sie Ihren eigenen Mechanismus bereitstellen. Ein üblicher Trick besteht darin, einen zusätzlichen Status zu erstellen, der keinen Code ausführt, er wird nur als Speicher verwendet. In Ihrem Fall würden Sie die Registrierung dieses zusätzlichen Status aus Ihrem C-Code verwenden. Leider gibt es keine Methode, um willkürliche Werte zwischen zwei Zuständen zu kopieren. Daher müssen Sie alle Tabellen ausrollen. Wenn Sie die Registrierung dafür verwenden, möchten Sie möglicherweise verfolgen, in welchem ​​Zustand Sie sie gespeichert haben, und sie im Originalzustand ausführen, wodurch sie effektiv zu einem Crossover-Werkzeug wird. Statusaufruf, anstatt die Funktion zu verschieben.

2

luaL_newstate() erstellt einen anderen separierten Status, wie der Name sagt. Die Registrierung wird nur zwischen Threads geteilt, die mit lua_newthread (parent_state) erstellt wurden.

bearbeiten die Frage bearbeiten entsprechen:

Sie können die Skripte im gleichen Zustand laufen, oder, wenn Sie das nicht wollen, müssen Sie Ihren eigenen Mechanismus schaffen, um die Daten zwischen den synchronisieren zwei Staaten.

2

Um mehrere Lua-Universen (Zustände) zu verwenden, finden Sie möglicherweise Lua Lanes einen Blick wert. Es gibt auch eine grobe von mehrstufigen Lua-Lösungen.

Bahnen bieten tatsächlich den "versteckten Zustand", den Javier erwähnt. Außerdem werden Sperren behandelt, die für den Zugriff auf solche freigegebenen Daten erforderlich sind, und die Möglichkeit, auf die Änderung solcher Daten zu warten. Und es kopiert alles, was kopierbar ist (einschließlich Funktionen und Schließungen) zwischen Ihren Anwendungszuständen und dem verborgenen Zustand.