void Run()
        {
            for (int i = 0; i < _task.Activities.Length; i++)
            {
                ScheduleActivity ac = _task.Activities[i];
                currentActivity = ac;
                while (true)
                {
                    bool canRun = true;
                    Dictionary <LinkedListNode <UnitReservation>, bool> currentUnit = new Dictionary <LinkedListNode <UnitReservation>, bool>();
                    for (int j = 0; j < ac.UnitReservations.Count; j++)
                    {
                        LinkedListNode <UnitReservation> pre = ac.UnitReservations[j].Previous;
                        currentUnit[ac.UnitReservations[j]] = true;
                        if (pre != null && (pre.Value.Activity.Status != Status.Processed || _scheduler.Current < ac.PlannedStart))
                        {
                            canRun = false;
                        }
                    }
                    if (canRun)
                    {
                        ac.ActualStart = _scheduler.Current;
                        ac.Status      = Status.Running;
                        Console.WriteLine("task {0} activity {1} is running", _task.ID, ac.Name);
                        ac.Execute();
                        while (true)
                        {
                            //检查下一个Activity是否可以开始,计算后便所有Activity的开始和结束时间
                            ScheduleActivity next       = ac.Next;
                            bool             canRunNext = true;
                            if (next != null && next.UnitReservations.Count > 0)
                            {
                                for (int j = 0; j < next.UnitReservations.Count; j++)
                                {
                                    LinkedListNode <UnitReservation> nur = next.UnitReservations[j].Previous;
                                    if (nur != null && !currentUnit.ContainsKey(nur))
                                    {
                                        if (nur.Value.Activity.Status != Status.Processed)
                                        {
                                            canRunNext = false;
                                        }
                                    }
                                }
                            }
                            if (canRunNext)
                            {
                                //是否提前结束
                                ac.ActualDuration = _scheduler.Current - ac.ActualStart - 1;
                                int now = _scheduler.Current;
                                Console.WriteLine(now);
                                if (ac.PlannedStart + ac.PlannedDuration > now)
                                {
                                    //前移
                                    Console.WriteLine("<<<<<<<<<<<<<< " + (ac.PlannedStart + ac.PlannedDuration - now));
                                    int offset = ac.PlannedStart + ac.PlannedDuration - now;
                                    MoveActivityBackword(ac, offset);
                                }
                                else if (ac.ActualStart + ac.ActualDuration < now)
                                {
                                    //后移
                                    Console.WriteLine(">>>>>>>>>>>>>>> " + (ac.PlannedStart + ac.PlannedDuration - now));

                                    int offset = now - ac.PlannedStart - ac.PlannedDuration;
                                    MoveActibityForward(ac, offset);
                                }
                                break;
                            }
                            Thread.Sleep(300);
                        }
                        ac.Status = Status.Processed;
                        break;
                    }
                    else
                    {
                        Thread.Sleep(300);
                    }
                }
            }
        }
Example #2
0
 public void SetData(ScheduleActivity ac)
 {
     _name     = ac.Name;
     _resource = ac.Reservations;
     _duration = ac.PlannedDuration;
 }