/// <summary> /// Determines if the queuing the an event causes a state to enter before defaultWaitTime elapses. /// </summary> /// <param name="eventToInject">The event to queue.</param> /// <param name="stateToWaitFor">The state to wait for.</param> /// <param name="waitTime">The time in ms to wait for the stateToWaitFor to enter.</param> /// <returns> /// True if the stateToWaitFor is entered. /// False if the stateToWaitFor is not entered before time expires. /// </returns> /// <remarks> /// This is a blocking call, the caller may be blocked for as long as waitTime. /// </remarks> public bool doesEventResultInState(NSFEvent eventToInject, NSFState stateToWaitFor, int waitTime) { firstSignal.clear(); stateToWaitFor.EntryActions += firstSignal.send; if (eventToInject != null) { eventToInject.queueEvent(); } if (stateToWaitFor.isActive()) { stateToWaitFor.EntryActions -= firstSignal.send; return(true); } if (!firstSignal.wait(waitTime)) { stateToWaitFor.EntryActions -= firstSignal.send; return(false); } stateToWaitFor.EntryActions -= firstSignal.send; return(true); }
/// <summary> /// Determines if the queuing the an event causes two states to enter before waitTime elapses. /// </summary> /// <param name="eventToInject">The event to queue.</param> /// <param name="stateToWaitFor">The first of two states to wait for.</param> /// <param name="secondStateToWaitFor">The second of two states to wait for.</param> /// <param name="waitTime">The time in ms to wait for the each state to enter.</param> /// <returns> /// True if both states are entered. /// False if either of the states fails to enter before time expires. /// </returns> /// <remarks> /// This is a blocking call, the caller may be blocked for as long as twice waitTime. /// The states may be congruently entered. /// </remarks> public bool doesEventResultInState(NSFEvent eventToInject, NSFState stateToWaitFor, NSFState secondStateToWaitFor, int waitTime) { secondSignal.clear(); stateToWaitFor.EntryActions += secondSignal.send; secondStateToWaitFor.EntryActions += secondSignal.send; if (!doesEventResultInState(eventToInject, stateToWaitFor, waitTime)) { secondStateToWaitFor.EntryActions -= secondSignal.send; return(false); } if (secondStateToWaitFor.isActive()) { secondStateToWaitFor.EntryActions -= secondSignal.send; return(true); } if (!secondSignal.wait(waitTime)) { secondStateToWaitFor.EntryActions -= secondSignal.send; return(false); } secondStateToWaitFor.EntryActions -= secondSignal.send; return(true); }
private void thread2Loop(NSFContext context) { while (contextSwitchCount < TotalContextSwitches) { signal1.wait(1000); signal2.send(); } }