/// <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.Show( this ); // this fires simulation while(_runBox.Visible) { Application.DoEvents(); } _composition.EditorMode = CompositionManager.EEditorMode.RunButNotReloaded; UpdateTitle(); CompositionUpdateArea(); } }