public void AddExecutor() { ExecutorClass Executor = new ExecutorClass(this); Executor.StatusChanged += new EventHandler(Recipe.Executor_StatusChanged); this.Executors.Add(Executor); OnRasieExecutorAddedEvent(Executor); //Notify viewmodel }
protected virtual void OnRasieExecutorAddedEvent(ExecutorClass executor) { EventHandler handler = ExecutorAdded; ExecutorAddedEventArgs arg = new ExecutorAddedEventArgs(executor); if (handler != null) { handler(this, arg); } }
public void AssignAssets(BatteryClass Battery, ChamberClass Chamber, TesterChannelClass TesterChannel) { //Check if the assets is in use or not first if (WaitingList.Count == 0) //Prompt warning { System.Windows.MessageBox.Show("No waiting tasks to assign assets to!"); return; } RequestedSubProgramClass RequestedSubProgram = TopWaitingRequestedSubProgram; ExecutorClass validExecutor = TopWaitingRequestedSubProgram.TopWaitingRequestedRecipe.ValidExecutor; validExecutor.AssignAssets(Battery, Chamber, TesterChannel); }
public void Executor_StatusChanged(object sender, EventArgs e) //可以不用event,而是把这个直接放到EstimateDuration的get里去。而且这个属于view而非model { try { ExecutorClass Executor = (ExecutorClass)sender; switch (Executor.Status) { case ExecutorStatus.Completed: EstimateDuration = Executor.EndTime - Executor.StartTime; //Just use the last executor's value here. A better and more complex way is to use historic average value. break; } } catch { //sender is not a ExecutorClass type return; } }
private void Executor_StatusChanged(object sender, EventArgs e) { try { ExecutorClass Executor = (ExecutorClass)sender; RequestedSubProgramClass root = Executor.RequestedRecipe.RequestedSubProgram; switch (Executor.Status) { case ExecutorStatus.Ready: WaitingList.Remove(root); ReadyList.Add(root); break; case ExecutorStatus.Executing: ReadyList.Remove(root); RunningList.Add(root); break; case ExecutorStatus.Completed: RunningList.Remove(root); if (root.RequestedRecipes.Count == 1) { CompletedList.Add(root); } else if (root.RequestedRecipes.Count > 1) { WaitingList.Insert(0, root); } break; case ExecutorStatus.Abandoned: if (ReadyList.Contains(root)) { ReadyList.Remove(root); } else if (WaitingList.Contains(root)) { WaitingList.Remove(root); } else if (RunningList.Contains(root)) { RunningList.Remove(root); } else if (CompletedList.Contains(root)) { CompletedList.Remove(root); } break; case ExecutorStatus.Invalid: Executor.RequestedRecipe.AddExecutor(); if (CompletedList.Contains(root)) { CompletedList.Remove(root); WaitingList.Insert(0, root); //back to the top by default } else if (RunningList.Contains(root)) { RunningList.Remove(root); WaitingList.Insert(0, root); //back to the top by default } break; } } catch { //sender is not a ExecutorClass type return; } }
public ExecutorAddedEventArgs(ExecutorClass newExecutor) { this.NewExecutor = newExecutor; }