2009-05-14 8 views
5

मेरी स्थिति यह है कि मैं एक स्ट्रिंग में आयोजित एक स्क्रिप्ट निष्पादित करने के लिए लुआ (सी) एपीआई का उपयोग कर रहा हूं। मैं चाहता हूं कि उपयोगकर्ता स्क्रिप्ट के निष्पादन को समाप्त कर सके (यह आवश्यक है कि स्क्रिप्ट में एक अनंत लूप है), मैं यह कैसे कर सकता हूं?मैं लू थ्रेड को साफ तरीके से कैसे समाप्त कर सकता हूं?

lua_State *Lua = lua_open(); 
char * code; 
// Initialisation code 
luaL_dostring(L, code); 

उत्तर

7

आप हर बार लियू को स्क्रिप्ट की एक पंक्ति निष्पादित करने के लिए कॉलबैक के लिए एक हुक का उपयोग कर सकते हैं। इस हुक फ़ंक्शन में आप यह जांच सकते हैं कि उपयोगकर्ता छोड़ना चाहता है या नहीं, और अगर उन्होंने किया तो lua_error को कॉल करें। तर्ज पर

static bool ms_quit = false; 

void IWantToQuit() 
{ 
    ms_quit = true; 
} 

void LineHookFunc(lua_State *L, lua_Debug *ar) 
{ 
    if(ar.event == LUA_HOOKLINE) 
     if(ms_quit == true) 
      luaL_error(L, "Too Many Lines Error"); 
} 
//... 

lua_State *Lua = lua_open(); 
char * code; 
// Initialisation code 
lua_sethook(Lua, &LineHookFunc, LUA_MASKLINE, 0); 
luaL_dostring(L, code); 
+0

आपके समय के लिए धन्यवाद। – CiscoIPPhone

+0

शायद आप 'lua_error (एल," संदेश ") को कॉल करने के लिए या 'lua_error (एल)' पर कॉल करने से पहले लुआ स्टैक पर कुछ धक्का देना चाहते हैं। –

+0

धन्यवाद अलेक्जेंडर, मैंने जवाब संपादित किया है। आप सी कोड में सिंगल लाइन लूप/अनंत लूप के बारे में सही हैं, मैं मानता हूं कि मैंने स्थिति की जटिलताओं में प्रवेश नहीं किया है। –

8

हुक पर्याप्त नहीं है। यह कोड एक पंक्ति है, लेकिन हमेशा के लिए loops:

while true do end 

आपको एक निर्देश गिनती हुक सेट करने की आवश्यकता है। अगर मैं गलत नहीं हूँ, कि हो सकता है

lua_sethook(Lua, &LineHookFunc, LUA_MASKCOUNT, NUM_INSTRUCTIONS); 

आप तो यह बहुत छोटा नहीं है NUM_INSTRUCTIONS लेने के लिए चाहते हैं (या आप एक प्रदर्शन भूमि के ऊपर मिलता है) और बहुत बड़ी नहीं है (या आप रोक जब तक बहुत लंबा इंतजार करेंगे)।

संबंधित लुआ-केवल कार्यान्वयन के लिए कृपया this library देखते हैं।

आप अविश्वस्त लुआ कोड से अधिक सुरक्षा जोड़ने के लिए, "लुआ सैंडबॉक्सिंग के लिए" गूगल चाहते हैं - सिर्फ अनंत लूप रोकथाम की तुलना में यह अधिक है।

+0

आप सही हैं। तीसरा पैरामीटर हालांकि LUA_MASKCOUNT नहीं होना चाहिए? यहां तक ​​कि केवल निर्देश आदर्श नहीं हैं - उदाहरण के लिए यदि लूआ कोड एक लंबे सी समारोह को कॉल करता है। हालांकि यह अब मेरे उद्देश्यों के लिए करेगा, धन्यवाद। – CiscoIPPhone

+0

हां, क्षमा करें। मैंने अब LUA_MASKCOUNT जोड़ा है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^