2009-03-14 14 views
7

क्या सी/सी ++ प्रोग्राम से लूआ कोड को मानक "lua_pcall" फ़ंक्शन कॉल की तुलना में अधिक बढ़िया स्तर पर चलाने का कोई तरीका है? आदर्श रूप से मैं निम्न-स्तरीय बाइटकोड निर्देशों की एक सूची में लूप करने में सक्षम होना चाहता हूं (मान लीजिए कि इसमें ऐसी चीजें हैं) और उन्हें एक-एक करके चलाएं, ताकि मैं अपना शेड्यूलर लिख सकूं जिसमें केवल दौड़ने से चीजों का अधिक नियंत्रण हो शुरुआत से खत्म करने के लिए एक पूर्ण लुआ समारोह।निम्न स्तर का लुआ दुभाषिया

कारण मैं ऐसा करना चाहता हूं क्योंकि मैं उन कार्यों को कार्यान्वित करना चाहता हूं जो लूआ कोड कॉल कर सकते हैं जिससे कार्यक्रम को तब तक इंतजार करना पड़ेगा जब तक निष्पादन जारी रखने से पहले एक निश्चित (संभावित रूप से लंबी हवा वाली) कार्रवाई पूरी नहीं हो जाती। एक सामान्य लुआ लिपि में ऐसी फ़ंक्शन कॉल का उच्च अनुपात होगा, इसलिए क्रिया पूर्ण होने के बाद कॉलबैक का उपयोग करने के लिए इसे फिर से लिखने का विचार वास्तव में व्यावहारिक नहीं है।

उत्तर

14

शायद सवाल उठाने के लिए, लेकिन आप कुछ सी घटना होने तक प्रतीक्षा करने के लिए कस्टम सी सामान की बजाय लुआ कोरआउट का उपयोग कर सकते हैं।

उदाहरण के लिए, एक कोरआउटिन waitForEvent() फ़ंक्शन को कॉल कर सकता है। वहां, आप तब तक किसी अन्य कोरो पर स्विच कर सकते हैं जब तक कि ईवेंट न हो, फिर पहले को फिर से शुरू करें। इसके बारे में अधिक जानकारी के लिए the lua coro docs पर एक नज़र डालें।

+1

इस समाधान में बहुत सी संभावनाएं होती हैं - विशेष रूप से यह देखते हुए कि सी एपीआई कोरआउट को स्वयं उत्पन्न/फिर से शुरू कर सकता है। – andygeers

6

कोररिन का उपयोग करने के लिए जेडर का सुझाव बहुत अच्छा काम करेगा यदि आप लुआ के सहकारी थ्रेडिंग (स्पष्ट उपज) सुविधा का उपयोग करके उन लंबी प्रतीक्षा सी रूटीन लिख सकते हैं। आप अभी भी लुआ में प्रवेश करने के लिए lua_pcall() का उपयोग करेंगे, लेकिन प्रवेश बिंदु आपका कोरआउटिन प्रबंधक कार्य होगा।

यह केवल तभी काम करता है जब सी रूटीन प्रतीक्षा करते समय कुछ भी नहीं करते हैं। यदि वे लंबे समय तक चल रहे हैं क्योंकि वे उदाहरण के लिए कुछ गणना करते हैं, तो आपको एकाधिक ओएस थ्रेड चलाने की आवश्यकता है। लुआ थ्रेडसेफ है - बस प्रत्येक थ्रेड में एकाधिक थ्रेड बनाएं और lua_open() चलाएं।

http://www.lua.org/pil/24.1.html से

लुआ पुस्तकालय सब पर कोई वैश्विक चर को परिभाषित करता है। यह गतिशील संरचना lua_State में स्थिति रखता है और संरचना के लिए एक सूचक को पर लूआ के अंदर सभी कार्यों के लिए एक तर्क के रूप में पारित किया जाता है। यह कार्यान्वयन लूआ पुनर्विक्रेता और को बहुप्रचारित कोड में उपयोग करने के लिए तैयार करता है।

आप दोनों दृष्टिकोणों को भी जोड़ सकते हैं। यदि आपके पास ओएस थ्रेड शुरू करने के लिए एक रैपर लुआ फ़ंक्शन है, तो आप थ्रेड शुरू करने के बाद उपज कर सकते हैं। कोरआउटिन प्रबंधक धागे का ट्रैक रखेगा और कोरआउट जारी रखेगा जब यह शुरू हुआ धागा समाप्त हो गया है। यह आपको शुद्ध सी कोड चलाने वाले एकाधिक कार्यकर्ता धागे के साथ एक एकल लुआ दुभाषिया का उपयोग करने देता है।

5

यदि आप ओएस थ्रेडिंग तरीके से जाते हैं, तो कृपया Lua Lanes पर एक नज़र डालें। मैं इसे प्राप्त करने की कोशिश कर रहा हूं (= मिश्रण में एक एडन मॉड्यूल फेंकने के लिए यह सही समाधान देखेंगे और आप निर्विवाद रूप से निर्मित मल्टीथ्रेडिंग के साथ स्पष्ट, समझने योग्य और सरल कोड बनायेंगे)।

कृपया हमें बताएं कि आपकी समस्या का समाधान कैसे हुआ। :)

+0

लिंक के लिए धन्यवाद - मैं निश्चित रूप से इस पर एक नज़र डालेगा – andygeers

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