/// <summary> /// Method stores copy of the event to internal queues so it later can /// be send to registered listeners. /// </summary> /// <param name="Event">Event to be queued.</param> /// <remarks>This method is called from thread where events are created (ie. simulation thread). /// We must make copy of the event for case caller changes it before it's delivered /// to registered listeners. /// Call blocks until event can be stored to internal queues. /// See <see cref="ProxyMultiThreadListener">ProxyMultiThreadListener</see>, /// <see cref="Initialize">Initialize</see> for more detail. /// </remarks> public void OnEvent(IEvent Event) { _mutex.WaitOne(); IEvent eventCopy; bool finished = false; // if event has special meaning, we don't have to copy it // because in such case we couldn't later determine it's meaning if (Event == CompositionManager.SimulationFinishedEvent || Event == CompositionManager.SimulationFailedEvent) { eventCopy = Event; finished = true; } else { eventCopy = new EventCopy(Event); } // add this event to registered listener queues foreach (InternalListenerRecord record in _internalListeners) { if (record.listenedEventTypes[(int)eventCopy.Type] || finished) { record.eventQueue.Enqueue(eventCopy); } } _mutex.ReleaseMutex(); }
/// <summary> /// Method stores copy of the event to internal queues so it later can /// be send to registered listeners. /// </summary> /// <param name="Event">Event to be queued.</param> /// <remarks>This method is called from thread where events are created (ie. simulation thread). /// We must make copy of the event for case caller changes it before it's delivered /// to registered listeners. /// Call blocks until event can be stored to internal queues. /// See <see cref="ProxyMultiThreadListener">ProxyMultiThreadListener</see>, /// <see cref="Initialize">Initialize</see> for more detail. /// </remarks> public void OnEvent( IEvent Event ) { _mutex.WaitOne(); IEvent eventCopy; bool finished = false; // if event has special meaning, we don't have to copy it // because in such case we couldn't later determine it's meaning if( Event==CompositionManager.SimulationFinishedEvent || Event==CompositionManager.SimulationFailedEvent ) { eventCopy = Event; finished = true; } else eventCopy = new EventCopy( Event ); // add this event to registered listener queues foreach( InternalListenerRecord record in _internalListeners ) if( record.listenedEventTypes[(int)eventCopy.Type] || finished ) record.eventQueue.Enqueue( eventCopy ); _mutex.ReleaseMutex(); }