コード例 #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);
        }
コード例 #2
0
ファイル: MainForm.cs プロジェクト: XiBeichuan/hydronumerics
		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();
			}				
		}