سؤال

أنا أبحث عن بعض العامة

  1. تحسين
  2. صحة
  3. القابلية للتوسعة

نصيحة بشأن تطبيق C++ Hierarchical State Machine الحالي.

عينة

variable isMicOn = false
variable areSpeakersOn = false
variable stream = false
state recording
{
        //override block for state recording
        isMicOn = true //here, only isMicOn is true              
        //end override block for state recording
}
state playback
{
        //override block for state playback
        areSpeakersOn = true //here, only areSpeakersOn = true
        //end override block for state playback
        state alsoStreamToRemoteIp
        {
                //override block for state alsoStreamToRemoteIp
                stream = true //here, both areSpeakersOn = true and stream = true
                //end override block for state alsoStreamToRemoteIp
        }
}

goToState(recording)
goToState(playback)
goToState(playback.alsoStreamToRemoteIp)

تطبيق

حاليًا، يتم تنفيذ HSM كهيكل شجرة حيث يمكن أن يكون لكل حالة عدد متغير من الحالات كأطفال.

تحتوي كل حالة على عدد متغير من كتل "التجاوز" (في std::map) التي تتجاوز القيم الأساسية.في حالة الجذر، تحتوي آلة الحالة على مجموعة من المتغيرات (الوظائف، الخصائص...) التي تمت تهيئتها لبعض القيم الافتراضية.في كل مرة ندخل فيها حالة فرعية، تحدد قائمة "التجاوزات" المتغير والقيم التي يجب أن تحل محل المتغيرات والقيم التي تحمل الاسم نفسه في الحالة الأصل.تم تحديث النسخة الأصلية من أجل الوضوح.

المتغيرات المرجعية

في وقت التشغيل، يتم تخزين الحالات الحالية على مكدس.

في كل مرة تتم الإشارة فيها إلى متغير، يتم تنفيذ مسار المكدس لأسفل بحثًا عن أعلى تجاوز، أو في حالة عدم وجود تجاوزات، القيمة الافتراضية.

تبديل الدول

في كل مرة يتم فيها التبديل إلى إطار حالة واحد، يتم دفع الحالة إلى المكدس.

في كل مرة يتم فيها التبديل إلى حالة ما، أتتبع انحدار الشجرة الذي ينقلني من الحالة الحالية إلى الحالة الجذرية.ثم أقوم بانحدار الشجرة من الحالة المستهدفة إلى الحالة الجذرية حتى أرى أن التتبع الحالي يطابق التتبع السابق.أعلن عن تقاطع عند نقطة التقاء هذين الخطين.بعد ذلك، للتبديل إلى الحالة المستهدفة، أنزل من المصدر، وأظهر إطارات الحالة من المكدس حتى أصل إلى نقطة التقاطع.ثم أصعد إلى العقدة المستهدفة وأدفع إطارات الحالة إلى المكدس.

لذلك بالنسبة لنموذج التعليمات البرمجية أعلاه

تتبع التنفيذ لتبديل الحالة

  • حالة المصدر = التسجيل
  • الحالة المستهدفة = أيضًاStreamToRemoteIp

  • النسب من المصدر = التسجيل->الجذر (تتبع = [الجذر])

  • النسب من الهدف = أيضًاStreamToRemoteIp->تشغيل->الجذر (تتبع = [تشغيل، جذر])

  • يتقاطع في الجذر.

للتبديل من التسجيل إلى أيضًاStreamToRemoteIp،

  1. قم بإخراج "التسجيل" من المكدس (واستدعاء وظيفة الخروج الخاصة به ...غير محدد هنا).
  2. ادفع "التشغيل" إلى المكدس (واستدعاء وظيفة الإدخال).
  3. ادفع "alsoStreamToRemoteIp" إلى المكدس (واستدعاء وظيفة الإدخال).
هل كانت مفيدة؟

المحلول

شيئان:

1:في معظم الحالات، قم فقط بتمثيل حالة برنامجك كنموذج، والتفاعل معه مباشرة أو من خلال نمط MVC.

2:إذا كنت حقًا بحاجة إلى ولايات ميكرونيزيا الموحدة، على سبيل المثال.تريد تنفيذ مجموعة من الإجراءات بشكل عشوائي على النموذج الخاص بك، يُسمح ببعضها فقط في أوقات معينة.ثم....

احتفظ بحالة برنامجك في نموذج (أو نماذج متعددة اعتمادًا على التحلل والتعقيد) وقم بتمثيل الحالات والانتقالات مثل.

class State:
   def __init__(self):
      self.neighbors = {}

حيث يحتوي الجيران على قاموس ل {Action: State}, ، حتى تتمكن من القيام بشيء مثل

someAction.execute() # Actions manipulate the model (use classes or lambdas)
currentState = currentState.neighbors[someAction]

أو حتى أكثر روعة، لديك حلقة لا نهائية تختار عشوائيًا إجراءً من الجيران، وتنفذه، وتحريك الحالة إلى أجل غير مسمى.إنها طريقة رائعة لاختبار برنامجك.

نصائح أخرى

لست متأكدًا من أنني أتابع كل التفاصيل هنا.ومع ذلك، يبدو أنك تصف تطبيق FSM (آلة الحالة المحدودة) حيث يكون لديك أجهزة حالة متعددة.في بعض الأحيان، عندما يحدث حدث معين (E1) في حالة معينة (S1) من FSM F1، تحتاج إلى إدخال FSM جديد (أطلق عليه F2) لتبسيط المعالجة بشكل عام).

إذا كان الأمر كذلك، فعند حدوث E1 في S1، فإنك تحتاج إلى استدعاء روتين الإجراء الذي يتولى قراءة الحدث وتنفيذ F2 FSM.عند استدعائه، يبدأ المعالجة في حالة البدء لـ F2، ويتعامل مع الأحداث الفرعية ذات الصلة.عندما يصل إلى حالته النهائية، ينتهي مترجم F2.قد يعيد بعض المعلومات إلى روتين إجراء F1 الذي تم تعليقه أثناء تشغيل F2، وقد تتأثر الحالة التالية في F1 بذلك.

بقية الوصف الخاص بك - أشياء مثل "تجاوز الكتل" - لن يكون لها معنى كبير للأشخاص الذين ليس لديهم إمكانية الوصول إلى التنفيذ الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top