//private int SessionIndexPlaying = -1; private void StartPlayer(int index) { //SessionIndexPlaying = index; StartIndex = index; CurrentIndex = index; CurrentState = EventsState.Playing; var lst = SessionElementOrderedList[CurrentIndex]; Sessions.ForEach(x => x.State = SessionState.WaitingForStartingElement); foreach (var sessionElement in lst.Where(x => IsValidStartingEvent(x))) //TODO: Check if sessionElements are able to start { sessionElement.Session.State = SessionState.Playing; sessionElement.State = SessionElementState.Playing; var logElementDTO = OnLoadLogElement?.Invoke(sessionElement); if (logElementDTO != null) { sessionElement.LogElementInfo.GUID = logElementDTO.GUID; var playElementResponse = OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: true); if (playElementResponse == PlayElementResponse.WaitingToBeExecuted) { sessionElement.State = SessionElementState.WaitingToTestIfCalledAutomatically; var t = new Thread(() => WaitForSessionElementToBeCalledAutomatically(logElementDTO)); t.IsBackground = true; t.Start(); } } } }
private void WaitForSessionElementToBeCalledAutomatically(LogElementDTO logElementDTO) { Thread.Sleep(5000); var sessionElement = GetPlayingSessionElement(logElementDTO.GUID); if (sessionElement != null && sessionElement.State == SessionElementState.WaitingToTestIfCalledAutomatically) { if (InvokeRequired) { Invoke(new MethodInvoker(delegate { OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: false); })); } } }
private NewEvent StartNewEventsIfPossible() //REMEMBER ONLY START CLIENTSIDE EVENTS!!! Serverside-events should have time to be executed before doing anything else... Denne metode sender blot information videre via OnPlayElement-eventet, som sørger for ikke at starte eventet hvis det er serverside { var lst = SessionElementOrderedList[CurrentIndex]; if (lst.Any(x => x.State == SessionElementState.Playing)) { return(NewEvent.WaitingForOtherClientEvents); //Still waiting for at least one element to complete } CurrentIndex++; if (SessionElementOrderedList.Count <= CurrentIndex) { return(NewEvent.None); //Completed everything! } var newEvent = NewEvent.None; lst = SessionElementOrderedList[CurrentIndex]; foreach (var sessionElement in lst.Where(x => x.Session.State == SessionState.Playing || x.Session.State == SessionState.WaitingForStartingElement && IsValidStartingEvent(x))) { //if (LogTypeHelper.IsClientsideEvent(sessionElement.LogElementInfo.LogType)) //{} sessionElement.Session.State = SessionState.Playing; sessionElement.State = SessionElementState.Playing; var logElementDTO = OnLoadLogElement?.Invoke(sessionElement); if (logElementDTO != null) { sessionElement.LogElementInfo.GUID = logElementDTO.GUID; var playElementResponse = OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: true); if (playElementResponse == PlayElementResponse.WaitingToBeExecuted) { //Hmm, noget er galt her... for den ovenstående foreach udfører alt for mange sessionElements på én gang... noget kalder BrowserJobComplete/done for events der overhovedet ikke er færdige???? sessionElement.State = SessionElementState.WaitingToTestIfCalledAutomatically; var t = new Thread(() => WaitForSessionElementToBeCalledAutomatically(logElementDTO)); t.IsBackground = true; t.Start(); newEvent = NewEvent.WaitingForServerEvents; } else { newEvent = NewEvent.StartedAtLeastOne; } } } return(newEvent); }