परिष्कृत राज्य मशीन कुछ अंत प्राप्त करने के लिए एक उपकरण हैं। किसी भी उपकरण के रूप में, उनका भी दुरुपयोग किया जा सकता है।
वे उपकरण की सबसे दयालु नहीं हैं, लेकिन वे जिस काम पर अच्छे हैं, वे अन्य साधनों से हासिल करना असंभव है (और आमतौर पर किसी भी अन्य दृष्टिकोण को मशीन से हजारों गुना अधिक भयानक गड़बड़ माना जाता है)।
नौकरी ऐसी स्थितियों में परिचालन कर रही है जहां क्लासिक प्रतीक्षा राज्यों को मना किया गया है।
मुझे टचस्क्रीन पढ़नी है। स्थिति को पढ़ने के लिए, मुझे एसपीआई पर लगभग 15 कमांड का आदान-प्रदान करना होगा। मुझे एक सेकंड में 100 रीडआउट्स चाहिए। प्रत्येक आदेश के बाद मुझे लगभग 1 माइक्रोसॉन्ड का इंतजार करना होगा, संबंधित व्यस्त ध्वज जारी रखने से पहले गायब हो जाएगा। ऐसे कई अन्य ऑपरेशंस भी हैं जो एक ही इंटरफ़ेस पर उपलब्ध होना चाहिए, जैसे कि कंट्रास्ट सेट करना, मोड बदलना, बैकलाइट चालू करना या बंद करना, तापमान पढ़ना। अगर मैंने प्रत्येक प्रतीक्षा के लिए while(BUSY_BIT);
प्रदर्शन किया, तो मैं क्षणों के मामले में सभी सीपीयू खाऊंगा। अगर मैंने sched_yield()
या usleep(1)
किया था, तो मैं कभी भी उन रीडआउट्स की संख्या प्राप्त नहीं करूंगा जो मैं चाहता हूं। एकमात्र तरीका एक सीमित राज्य मशीन है।
लेकिन परिमित राज्य मशीन को भी अच्छा बनाने के तरीके हैं। दृश्यों के पीछे मशीन को छुपाएं और डेवलपर्स को काम करने के लिए काम करें।
मेरा नौकरी अनुभव अब तक 2 अलग-अलग परिमित राज्य मशीनों के आधार पर 2 सिस्टमों का प्रभुत्व था।
- एक बड़ा वेब पोर्टल, जहां प्रत्येक चरण में आप डेटाबेस से कुछ डेटा पुनर्प्राप्त करते हैं, और उस पर आधारित अधिक प्रश्न तैयार करते हैं। अंतिम चरण में आप HTML उत्पन्न करने के लिए डेटा का उपयोग करते हैं। प्रत्येक कार्य - एक वेबपृष्ठ मॉड्यूल - इंजन से विरासत में प्राप्त एक PHP वर्ग के रूप में लागू किया गया था। राज्य कक्षा चर में संरक्षित किया गया था। प्रत्येक चरण एक अलग समारोह था। एक कदम के अंत में, संग्रहित प्रश्नों को अनुकूलित किया गया और इंजन को कैश के माध्यम से भेजा गया, और उत्तर मूल पर वापस प्रदान किए गए।
- कई उपप्रणाली वाले एक एम्बेडेड डिवाइस। कार्य पंप का उपयोग किया जाता है। प्रत्येक मॉड्यूल एक हैंडलर को पंजीकृत करता है जिसे मुख्य लूप से कई बार कहा जाता है। हैंडलर राज्यों के साथ स्थिर या वर्ग चर में राज्य को संरक्षित रख सकता है। यह सहकारी मल्टीटास्किंग अलग-अलग धागे में चलने की तुलना में बहुत छोटी मेमोरी पदचिह्न की अनुमति देता है, उन्हें मैन्युअल रूप से दो बार पंजीकृत करके मैन्युअल प्राथमिकता के लिए अनुमति देता है, और थ्रेड उच्च प्राथमिकता पर चलता है, शेष सिस्टम को ओवरहाइड करता है।
- सेमी-दुभाषिया। वह टचस्क्रीन। फंक्शन कॉल और उनके प्रतीक्षा राज्य पंजीकृत हैं, लेकिन प्रत्येक को केवल एक बार बुलाया जाता है, फिर प्रोग्राम कतार से हटा दिया जाता है। दुभाषिया को टास्कपंप का कार्य कहा जाता है, जो एक प्रतीक्षा स्थिति के रूप में चिह्नित फ़ंक्शन का सामना करते हुए सीमित संख्या में फ़ंक्शन निष्पादित करता है (या कहने वाले कार्यों की संख्या से अधिक)। फिर यह तब तक जारी रहता है जब तक प्रतीक्षा राज्य गायब न हो जाए। अन्य कार्य निष्पादित किए जाने वाले कार्यों के अनुक्रमों (कभी-कभी लंबे) के रूप में कार्यवाही करते हैं, फिर परिणाम के लिए प्रतीक्षा करें। इस तरह से मैं उन राज्यों की संख्या को सीमित कर सकता हूं जिन्हें मुझे लगभग 4 तक बनाने की आवश्यकता है जहां मुझे परिणामों की आवश्यकता है। यदि आदेश "भेजना, कभी भी परिणाम की जांच न करें" जैसे "सेट कंट्रास्ट" है, तो उन्हें अलग-अलग राज्यों की आवश्यकता नहीं है। तो वास्तविक राज्य "घटना के लिए प्रतीक्षा करें और अनुरोधित डेटा पंजीकृत करें", "माप के लिए प्रतीक्षा करें" और "परिणाम पढ़ें और उन्हें ठीक से असाइन करें"।
कोड दो बार सरल और तीन बार स्पष्ट होगा यदि संरचनात्मक रूप से या अनुक्रमिक रूप से लिखा गया हो। सिवाय इसके कि यह काम नहीं करेगा, या अबाध प्रदर्शन के साथ काम करेगा।
स्रोत
2010-02-02 11:22:12
संबंधित: http://stackoverflow.com/questions/1647631/c-state-machine-design – jldupont
एक भक्त Pastafarian जैसा कि मैंने पहले नौकरियों में एक FSM को क्रियान्वित किया है, यहाँ एक कंकाल टेम्पलेट है , एफएसएम हमेशा अच्छा होता है;) – richo
कभी भी एक संपूर्ण दृष्टिकोण को नाराज न करें क्योंकि आप इसके खराब कार्यान्वयन को देख रहे हैं। कुछ भी जो अनियंत्रित/डीबग करने के लिए कठिन है, बुरा है, लेकिन यह कार्यान्वयन खराब है। –