예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public ProcessingContextStep PopStep()
        {
            ProcessingContextStep step = null;

            if (CurrentProcessingContext.m_NextExecutions.Count > 0)
            {
                step = CurrentProcessingContext.m_NextExecutions[0];
                CurrentProcessingContext.m_NextExecutions.RemoveAt(0);
                CurrentProcessingContext.m_Executed.Add(step);
            }
            else
            {
                if (CurrentProcessingContext.Finished != null)
                {
                    CurrentProcessingContext.Finished(CurrentProcessingContext, EventArgs.Empty);
                }

                if (CurrentProcessingContext.Parent != null)
                {
                    ProcessingContext c = CurrentProcessingContext;
                    CurrentProcessingContext.Parent.Child = null;
                    // Call Parent.PopStep() else the execution will stop because step is null
                    step = c.Parent.PopStep();
                }
            }

            return(step);
        }
예제 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="node_"></param>
        public ProcessingContextStep RegisterNextExecution(NodeSlot slot_)
        {
            if (slot_.Node is ActionNode == false)
            {
                throw new InvalidOperationException("ProcessingContext.RegisterNextExecution() : the node is not an ActionNode");
            }

            ProcessingContextStep step = new ProcessingContextStep(SequenceBase, CurrentFrame, slot_);

            CurrentProcessingContext.m_NextExecutions.Add(step);
            return(step);
        }
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        private void ProcessLoop(bool sleep_ = true)
        {
            bool processing = true;

            while (processing == true &&
                   m_MustStop == false)
            {
                if (m_IsOnPause == false)
                {
                    processing = DoOneStep();

                    if (processing == true)
                    {
                        State = SequenceState.Running;
                    }
                }
                else if (m_UpdateOnlyOneStep == true)
                {
                    m_UpdateOnlyOneStep = false;
                    processing          = DoOneStep();

                    if (processing == true)
                    {
                        State = SequenceState.Pause;
                    }
                }

                if (sleep_ == true)
                {
                    // Do sleep else all WPF bindings will block the UI thread
                    // 5ms else the UI is not enough responsive
                    System.Threading.Thread.Sleep(5);
                }
            }
            ;

            State           = SequenceState.Stop;
            m_LastExecution = null;

            foreach (ProcessingContext c in m_CallStacks)
            {
                c.SequenceBase.ResetNodes();
            }
        }
예제 #4
0
        /// <summary>
        ///
        /// </summary>
        /// <returns>true if there is at least one node to be activated else returns false</returns>
        public bool DoOneStep()
        {
            if (GetNumberOfActiveProcess() > 0)
            {
                if (State == SequenceState.Pause)
                {
                    if (m_LastExecution != null)
                    {
                        m_LastExecution.Slot.Node.IsProcessing = false;
                    }
                }

                ProcessingContext     context     = m_CallStacks[m_CurrentCallStackIndex];
                ProcessingContextStep contextStep = context.PopStep();

                if (contextStep == null)
                {
                    m_CallStacks.Remove(context);
                    context.SequenceBase.ResetNodes();
                }
                else
                {
                    ActionNode node = contextStep.Slot.Node as ActionNode;
                    m_LastExecution = contextStep;

                    ActionNode.ProcessingInfo info = node.Activate(context, contextStep.Slot);
                    node.ErrorMessage = info.ErrorMessage;

                    if (info.State == ActionNode.LogicState.Error)
                    {
                        context.IsOnError = true;
                    }

                    if (State == SequenceState.Pause)
                    {
                        m_LastExecution.Slot.Node.IsProcessing = true;
                    }
                }
            }

            return(SetNextProcess());
        }
예제 #5
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="context_"></param>
 /// <param name="step_"></param>
 public void RemoveExecution(ProcessingContext context_, ProcessingContextStep step_)
 {
     context_.m_NextExecutions.Remove(step_);
 }