Ignore:
Timestamp:
Aug 12, 2010, 12:16:43 AM (11 years ago)
Author:
kopal
Message:
  • added SleepTime Settings
  • structured the ExecutionEngine for better overview
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/WorkspaceManager/Execution/ExecutionEngine.cs

    r1803 r1805  
    4747        public bool BenchmarkPlugins { get; set; }
    4848        public long GuiUpdateInterval { get; set; }
     49        public int SleepTime { get; set; }
    4950
    5051        /// <summary>
     
    327328            while (this.executionEngine.IsRunning)
    328329            {
    329                 yield return Receive<MessageExecution>(null,HandleExecute);
    330                 //this.HandleExecute((MessageExecution)stateMachine.CurrentMessage);
    331             }
    332         }
    333 
    334         /// <summary>
    335         /// Call the execution function of the wrapped IPlugin
     330                yield return Receive<MessageExecution>(null, HandleExecute);
     331            }
     332        }
     333
     334        /// <summary>
     335        /// Handle an execution of a plugin
    336336        /// </summary>
    337337        /// <param name="msg"></param>
    338338        private void HandleExecute(MessageExecution msg)
    339339        {
    340            
    341             if (!msg.PluginModel.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
     340            // 1. Check if Plugin may Execute
     341            if (!mayExecute(PluginModel))
    342342            {
    343343                return;
    344344            }
    345            
    346             //Check if all necessary inputs are set
    347             foreach (ConnectorModel connectorModel in msg.PluginModel.InputConnectors)
    348             {
    349                 if (!connectorModel.IControl &&
    350                     (connectorModel.IsMandatory || connectorModel.InputConnections.Count > 0) && (!connectorModel.HasData ||
    351                     connectorModel.Data==null))
    352                 {
    353                     return;
    354                 }
    355             }
    356 
    357             //Check if all outputs are free
    358             foreach (ConnectorModel connectorModel in msg.PluginModel.OutputConnectors)
    359             {
    360                 if (!connectorModel.IControl)
     345
     346            //2. Fill all Inputs of the plugin, if this fails, stop executing the plugin
     347            if (!fillInputs())
     348            {
     349                return;
     350            }
     351
     352            //3. Execute the Plugin -> call the IPlugin.Execute()
     353            PluginModel.Plugin.Execute();
     354
     355            //4. Count for the benchmark
     356            if (this.executionEngine.BenchmarkPlugins)
     357            {
     358                this.executionEngine.ExecutedPluginsCounter++;
     359            }
     360
     361            //5. If the user wants to, sleep some time
     362            if (this.executionEngine.SleepTime > 0)
     363            {
     364                Thread.Sleep(this.executionEngine.SleepTime);
     365            }
     366
     367            //6. Clear all used inputs
     368            clearInputs();
     369
     370            //7. Fill all outputs of our plugin
     371            fillOutputs();
     372
     373            //8. Send start messages to possible executable next plugins
     374            runNextPlugins();
     375        }
     376
     377        /// <summary>
     378        /// Send execute messages to possible executable next plugins
     379        /// </summary>
     380        private void runNextPlugins()
     381        {
     382            foreach (ConnectorModel connectorModel in PluginModel.OutputConnectors)
     383            {
     384                foreach (ConnectionModel connectionModel in connectorModel.OutputConnections)
     385                {
     386                    if (mayExecute(connectionModel.To.PluginModel))
     387                    {
     388                        MessageExecution msg_exce = new MessageExecution();
     389                        msg_exce.PluginModel = connectionModel.To.PluginModel;
     390                        connectionModel.To.PluginModel.PluginProtocol.BroadcastMessage(msg_exce);
     391                    }
     392                }
     393            }
     394
     395            foreach (ConnectorModel connectorModel in PluginModel.InputConnectors)
     396            {
     397                foreach (ConnectionModel connectionModel in connectorModel.InputConnections)
     398                {
     399                    if (!connectionModel.From.PluginModel.Startable ||
     400                        (connectionModel.From.PluginModel.Startable && connectionModel.From.PluginModel.RepeatStart))
     401                    {
     402                        if (mayExecute(connectionModel.From.PluginModel))
     403                        {
     404                            MessageExecution message_exec = new MessageExecution();
     405                            message_exec.PluginModel = connectionModel.From.PluginModel;
     406                            connectionModel.From.PluginModel.PluginProtocol.BroadcastMessageReliably(message_exec);
     407                        }
     408                    }
     409                }
     410            }
     411        }
     412
     413        /// <summary>
     414        /// Fill all outputs of the plugin
     415        /// </summary>
     416        private void fillOutputs()
     417        {
     418            foreach (ConnectorModel connectorModel in PluginModel.OutputConnectors)
     419            {
     420                object data;
     421
     422                if (connectorModel.IsDynamic)
     423                {
     424                    data = connectorModel.PluginModel.Plugin.GetType().GetMethod(connectorModel.DynamicGetterName).Invoke(connectorModel.PluginModel.Plugin, new object[] { connectorModel.PropertyName });
     425                }
     426                else
     427                {
     428                    data = connectorModel.PluginModel.Plugin.GetType().GetProperty(connectorModel.PropertyName).GetValue(connectorModel.PluginModel.Plugin, null);
     429                }
     430
     431                if (data != null)
    361432                {
    362433                    foreach (ConnectionModel connectionModel in connectorModel.OutputConnections)
    363434                    {
    364                         if (connectionModel.To.HasData)
    365                         {
    366                             return;
    367                         }
    368                     }
    369                 }
    370             }
    371 
     435                        Data Data = new Data();
     436                        Data.value = data;
     437                        connectionModel.To.Data = Data;
     438                        connectionModel.To.HasData = true;
     439                        connectionModel.Active = true;
     440                        connectionModel.GuiNeedsUpdate = true;
     441                        connectorModel.Data = Data;
     442                    }
     443                }
     444            }
     445        }
     446
     447        /// <summary>
     448        /// Delete all input data of inputs of the plugin
     449        /// </summary>
     450        private void clearInputs()
     451        {
     452            foreach (ConnectorModel connectorModel in PluginModel.InputConnectors)
     453            {
     454                if (connectorModel.HasData)
     455                {
     456                    connectorModel.Data = null;
     457                    connectorModel.HasData = false;
     458                    foreach (ConnectionModel connectionModel in connectorModel.InputConnections)
     459                    {
     460                        connectionModel.Active = false;
     461                        connectorModel.GuiNeedsUpdate = true;
     462                    }
     463                }
     464            }
     465        }
     466
     467        /// <summary>
     468        /// Fill all inputs of the plugin
     469        /// </summary>
     470        /// <returns></returns>
     471        private bool fillInputs()
     472        {
    372473            //Fill the plugins inputs with data
    373474            foreach (ConnectorModel connectorModel in PluginModel.InputConnectors)
     
    394495                    this.PluginModel.State = PluginModelState.Error;
    395496                    this.PluginModel.GuiNeedsUpdate = true;
    396                     return;
    397                 }
    398             }
    399            
    400             msg.PluginModel.Plugin.Execute();
    401 
    402             if (this.executionEngine.BenchmarkPlugins)
    403             {
    404                 this.executionEngine.ExecutedPluginsCounter++;
    405             }
    406 
    407             foreach (ConnectorModel connectorModel in PluginModel.InputConnectors)
    408             {
    409                 if (connectorModel.HasData)
    410                 {                   
    411                     connectorModel.Data = null;
    412                     connectorModel.HasData = false;
    413                     foreach (ConnectionModel connectionModel in connectorModel.InputConnections)
    414                     {
    415                         connectionModel.Active = false;
    416                         connectorModel.GuiNeedsUpdate = true;
    417                     }
    418                 }
    419             }
    420 
    421             foreach (ConnectorModel connectorModel in PluginModel.OutputConnectors)
    422             {
    423                 object data;
    424 
    425                 if (connectorModel.IsDynamic)
    426                 {
    427                     data = connectorModel.PluginModel.Plugin.GetType().GetMethod(connectorModel.DynamicGetterName).Invoke(connectorModel.PluginModel.Plugin, new object[] { connectorModel.PropertyName });
    428                 }
    429                 else
    430                 {
    431                     data = connectorModel.PluginModel.Plugin.GetType().GetProperty(connectorModel.PropertyName).GetValue(connectorModel.PluginModel.Plugin, null);
    432                 }
    433 
    434                 if (data != null)
     497                    return false;
     498                }
     499            }
     500            return true;
     501        }
     502
     503        /// <summary>
     504        /// Check if the PluginModel may execute
     505        /// </summary>
     506        /// <param name="pluginModel"></param>
     507        /// <returns></returns>
     508        private bool mayExecute(PluginModel pluginModel)
     509        {
     510            if (!pluginModel.WorkspaceModel.WorkspaceManagerEditor.isExecuting())
     511            {
     512                return false;
     513            }
     514
     515            //Check if all necessary inputs are set
     516            foreach (ConnectorModel connectorModel in pluginModel.InputConnectors)
     517            {
     518                if (!connectorModel.IControl &&
     519                    (connectorModel.IsMandatory || connectorModel.InputConnections.Count > 0) && (!connectorModel.HasData ||
     520                    connectorModel.Data == null))
     521                {
     522                    return false;
     523                }
     524            }
     525
     526            //Check if all outputs are free
     527            foreach (ConnectorModel connectorModel in pluginModel.OutputConnectors)
     528            {
     529                if (!connectorModel.IControl)
    435530                {
    436531                    foreach (ConnectionModel connectionModel in connectorModel.OutputConnections)
    437532                    {
    438 
    439                         Data Data = new Data();
    440                         Data.value = data;
    441                         connectionModel.To.Data = Data;
    442                         connectionModel.To.HasData = true;
    443                         connectionModel.Active = true;
    444                         connectionModel.GuiNeedsUpdate = true;
    445                     }
    446                 }
    447             }
    448            
    449             foreach (ConnectorModel connectorModel in PluginModel.OutputConnectors)
    450             {
    451                 foreach (ConnectionModel connectionModel in connectorModel.OutputConnections)
    452                 {
    453                     MessageExecution msg_exce = new MessageExecution();
    454                     msg_exce.PluginModel = connectionModel.To.PluginModel;
    455                     connectionModel.To.PluginModel.PluginProtocol.BroadcastMessage(msg_exce);
    456                 }
    457             }
    458 
    459 
    460             foreach (ConnectorModel connectorModel in PluginModel.InputConnectors)
    461             {
    462                 foreach (ConnectionModel connectionModel in connectorModel.InputConnections)
    463                 {
    464                     if (!connectionModel.From.PluginModel.Startable ||
    465                         (connectionModel.From.PluginModel.Startable && connectionModel.From.PluginModel.RepeatStart))
    466                     {
    467                         MessageExecution message_exec = new MessageExecution();
    468                         message_exec.PluginModel = connectionModel.From.PluginModel;
    469                         connectionModel.From.PluginModel.PluginProtocol.BroadcastMessageReliably(message_exec);
    470                     }
    471                 }
    472             }
     533                        if (connectionModel.To.HasData)
     534                        {
     535                            return false;
     536                        }
     537                    }
     538                }
     539            }
     540            return true;
    473541        }
    474542    }
Note: See TracChangeset for help on using the changeset viewer.