Beispiel #1
0
        /// <summary>
        /// This function sends all queued events to listeners registered using
        /// <see cref="Initialize">Initialize</see> method.
        /// </summary>
        /// <remarks>
        /// Events are queued by simulation thread using <see cref="OnEvent">OnEvent</see> method.
        /// Call this function from thread, where you want registered listeners to work (ie. from UI thread).
        /// Calling thread blocks until all registered listeners have done its work.
        /// If simulation finished, the timer is disabled to stop calling it's handler.
        /// </remarks>
        public bool SendEventsToListeners()
        {
            bool finished = false;

            _mutex.WaitOne();

            try
            {
                foreach (InternalListenerRecord record in _internalListeners)
                {
                    ListViewListener listViewListener = record.listener as ListViewListener;
                    if (listViewListener != null)
                    {
                        // optimization for case listener is ListBoxListener
                        finished |= listViewListener.AddQueuedEvents(record.eventQueue);
                    }
                    else
                    {
                        // send all events separatelly
                        while (record.eventQueue.Count > 0)
                        {
                            IEvent theEvent = (IEvent)record.eventQueue.Dequeue();

                            finished |= theEvent == CompositionManager.SimulationFinishedEvent || theEvent == CompositionManager.SimulationFailedEvent;

                            record.listener.OnEvent(theEvent);
                        }
                    }
                }
            }
            finally
            {
                _mutex.ReleaseMutex();
            }

            if (finished)
            {
                if (_timer.Enabled)
                {
                    _timer.Enabled = false;
                    _timer.Tick   -= new System.EventHandler(SendEventsToListenersHandler);
                }
            }

            return(finished);
        }
        private void menuDeployRun_Click(object sender, System.EventArgs e)
        {
            StopAllActions();

            _runProperties.PopulateDialog( _composition, _compositionFilename==null );
            DialogResult result = _runProperties.ShowDialog( this );

            UpdateTitle();

            if( result == DialogResult.OK )
            {
                // user decided to run the composition

                // ### prepare listeners
                ArrayList listOfListeners = new ArrayList();

                // progress bar
                ProgressBarListener progressBarListener = new ProgressBarListener( _composition.GetSimulationTimehorizon(), _runBox.ProgressBarRun );
                listOfListeners.Add( progressBarListener );

                // log file
                if( _composition.LogToFile!=null && _composition.LogToFile!="" )
                {
                    // get composition file's directory to logfile is saved in same directory
                    string logFileName;
                    if( _compositionFilename!=null )
                    {
                        FileInfo compositionFileInfo = new FileInfo(_compositionFilename);
                        FileInfo logFileInfo = Utils.GetFileInfo( compositionFileInfo.DirectoryName, _composition.LogToFile );
                        logFileName = logFileInfo.FullName;
                    }
                    else
                        logFileName = _composition.LogToFile;

                    LogFileListener logFileListener = new LogFileListener( _composition.ListenedEventTypes, logFileName );
                    listOfListeners.Add( logFileListener );
                }

                // list box
                if( _composition.ShowEventsInListbox )
                {
                    ListViewListener listViewListener = new ListViewListener( _composition.ListenedEventTypes, _runBox.ListViewEvents, 400 );
                    listOfListeners.Add( listViewListener );
                }

                const uint actionInterval = 200; // in milliseconds

                // ### create proxy listener and register other listeners to it
                IListener proxyListener;
                if( _composition.RunInSameThread )
                {
                    // DoEvents listener
                    DoEventsListener doEventsListener = new DoEventsListener( actionInterval );
                    listOfListeners.Add( doEventsListener );

                    ProxyListener proxySingleThreadListener = new ProxyListener();
                    proxySingleThreadListener.Initialize( listOfListeners );
                    proxyListener = proxySingleThreadListener;
                }
                else
                {
                    ProxyMultiThreadListener proxyMultiThreadListener = new ProxyMultiThreadListener();
                    proxyMultiThreadListener.Initialize( listOfListeners, _runBox.Timer, (int)actionInterval );
                    proxyListener = proxyMultiThreadListener;
                }

                // ### populate and show run-dialog and run simulation from it
                Invalidate();
                _runBox.PopuplateDialog( _composition, proxyListener );
                _runBox.ShowDialog( this ); // this fires simulation

            }
        }