Ich habe eine Netzwerkanwendung, die Lua-Skripts verwendet. Nach dem Start der Anwendung erstelle ich einen globalen Lua-Status und lade alle Skriptdateien, die verschiedene Funktionen enthalten. Für jeden Client, der eine Verbindung herstellt, erstelle ich einen Lua-Thread für diese Verbindung.Abbrechen Ertrag von Host
Wenn eine Anfrage, die ein Skript verwendet, kommt, bekomme ich die globale Funktion und rufe sie auf.
var NL = connection.State;
var result = lua_resume(NL, 0);
if (result != 0 && result != LUA_YIELD)
{
// error...
result = 0;
}
if (result == 0)
{
// function returned...
}
Nun verlangen einige Skripte eine Antwort auf etwas, von dem Client, so dass ich Ausbeute in diesen Funktionen, darauf zu warten. Wenn die Antwort eingeht, wird das Skript mit lua_resume(NL, 1)
fortgesetzt.
// Lua
text("How are you?")
local response = select("Good", "Bad")
// Host
private int select(IntPtr L)
{
// send response request...
return lua_yield(L, 1);
}
// On response
lua_pushstring(NL, response);
var result = lua_resume(NL, 1);
// ...
Mein Problem ist, dass ich die Ausbeute in der Lage sein müssen und von der Lua-Funktion zurückkehren zu annullieren, ohne dass in der Lua-Funktion mehr Code ausgeführt, und ohne zusätzlichen Code zu den Skripten hinzuzufügen. Mit anderen Worten, ich möchte im Grunde den Lua-Thread eine Ausnahme machen lassen, zurück zum Anfang gehen und vergessen, dass er diese Funktion jemals ausgeführt hat.
Ist das möglich?
Eine Sache, die ich dachte, könnte funktionieren, aber nicht, rief lua_error
. Das Ergebnis war ein SEHException
auf dem lua_error
Aufruf. Ich nehme an, weil das Skript momentan nicht läuft, sondern nachgibt.